home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / smb_nt.inc < prev    next >
Text File  |  2005-03-31  |  97KB  |  3,485 lines

  1. # -*- Fundamental -*-
  2. #
  3. # (C) Tenable Network Security
  4. #
  5. # smb_nt.inc 
  6. # $Revision: 1.81 $
  7. #
  8.  
  9. include ('crypto_func.inc');
  10.  
  11. global_var multiplex_id, g_mhi, g_mlo;
  12.  
  13. multiplex_id = rand();
  14. g_mhi = multiplex_id / 256;
  15. g_mlo = multiplex_id % 256;
  16.  
  17.  
  18. function kb_smb_name()
  19. {
  20.  return string(get_kb_item("SMB/name"));
  21. }
  22.  
  23. function kb_smb_domain()
  24. {
  25.  return string(get_kb_item("SMB/domain"));
  26. }
  27.  
  28. function kb_smb_login()
  29. {
  30.  return string(get_kb_item("SMB/login"));
  31. }
  32.  
  33. function kb_smb_password()
  34. {
  35.  return string(get_kb_item("SMB/password"));
  36. }
  37.  
  38. function kb_smb_transport()
  39. {
  40.  local_var r;
  41.  r = get_kb_item("SMB/transport");
  42.  if ( r ) return int(r);
  43.  else return 445;
  44. }
  45.  
  46.  
  47. #-----------------------------------------------------------------#
  48. # Reads a SMB packet                          #
  49. #-----------------------------------------------------------------#
  50. function smb_recv(socket, length)
  51. {
  52.    local_var header, len, trailer;
  53.  
  54.    header = recv(socket:socket, length:4, min:4);
  55.    if (strlen(header) < 4)return(NULL);
  56.    len = 256 * ord(header[2]);
  57.    len += ord(header[3]);
  58.    if (len == 0)return(header);
  59.    trailer = recv(socket:socket, length:len, min:len);
  60.    if(strlen(trailer) < len )return(NULL);
  61.    return strcat(header, trailer);
  62. }
  63.  
  64. #-----------------------------------------------------------------#
  65. # Encode name and service to the netbios network format           #
  66. #-----------------------------------------------------------------#
  67. function netbios_encode(data,service)
  68. {
  69.  local_var tmpdata, ret;
  70.  
  71.  ret = "";
  72.  tmpdata = data; 
  73.  
  74.  while (strlen(tmpdata) < 15)
  75.  {
  76.    tmpdata += " ";
  77.  }
  78.  
  79.  tmpdata += raw_string(service);
  80.  
  81.  for(i=0;i<16;i=i+1)
  82.  {
  83.    o = ord(tmpdata[i]);
  84.    odiv = o/16;
  85.    odiv = odiv + ord("A");
  86.    omod = o%16;
  87.    omod = omod + ord("A");
  88.    c = raw_string(odiv, omod);
  89.  
  90.    ret = ret+c;
  91.  }
  92.  
  93.  return(ret); 
  94. }
  95.  
  96. #-----------------------------------------------------------------#
  97. # Convert a netbios name to the netbios network format            #
  98. #-----------------------------------------------------------------#
  99. function netbios_name(orig)
  100. {
  101.  return netbios_encode(data:orig, service:0x20); 
  102. }
  103.  
  104. #--------------------------------------------------------------#
  105. # Returns the netbios name of a redirector                     #
  106. #--------------------------------------------------------------#
  107.  
  108. function netbios_redirector_name()
  109. {
  110.  ret = crap(data:"CA", length:30);
  111.  ret = ret+"AA";
  112.  return(ret); 
  113. }
  114.  
  115. #-------------------------------------------------------------#
  116. # return a 28 + strlen(data) + (odd(data)?0:1) long string    #
  117. #-------------------------------------------------------------#
  118. function unicode(data)
  119. {
  120.  len = strlen(data);
  121.  ret = raw_string(ord(data[0]));
  122.  
  123.  for(i=1;i<len;i=i+1)
  124.  {
  125.   ret = string(ret, raw_string(0, ord(data[i])));
  126.  }
  127.  
  128.  
  129.  if(!(len & 1)){even = 1;}
  130.  else even = 0;
  131.  
  132.  
  133.  for(i=0;i<7;i=i+1)
  134.   ret = ret + raw_string(0);
  135.   
  136.   
  137.  if(even) ret = ret + raw_string(0x00, 0x00);
  138.  
  139.   
  140.  return(ret);
  141. }
  142.  
  143.  
  144.  
  145.  
  146. #----------------------------------------------------------#
  147. # Request a new SMB session                                #
  148. #----------------------------------------------------------#
  149. function smb_session_request(soc, remote, transport)
  150. {
  151.  if ( transport )
  152.     trp = transport;
  153.  else 
  154.      trp = kb_smb_transport();
  155.  
  156.  # We don't need to request a session when talking on top of
  157.  # port 445
  158.  if(trp == 445)
  159.   return(TRUE);
  160.   
  161.  nb_remote = netbios_name(orig:remote);
  162.  nb_local  = netbios_redirector_name();
  163.  
  164.  session_request = raw_string(0x81, 0x00, 0x00, 0x44) + 
  165.           raw_string(0x20) + 
  166.           nb_remote +
  167.           raw_string(0x00, 0x20)    + 
  168.           nb_local  + 
  169.           raw_string(0x00);
  170.  
  171.  send(socket:soc, data:session_request);
  172.  r = smb_recv(socket:soc, length:4000);
  173.  if(ord(r[0])==0x82)return(r);
  174.  else return(FALSE);
  175. }
  176.  
  177. #------------------------------------------------------------#
  178. # Extract the UID from the result of smb_session_setup()     #
  179. #------------------------------------------------------------#
  180.  
  181. function session_extract_uid(reply)
  182. {
  183.  low = ord(reply[32]);
  184.  high = ord(reply[33]);
  185.  ret = high * 256;
  186.  ret = ret + low;
  187.  return(ret);
  188. }
  189.  
  190.  
  191.  
  192. #-----------------------------------------------------------#
  193. # Negociate (pseudo-negociate actually) the protocol        #
  194. # of the session                                            #
  195. #-----------------------------------------------------------#
  196.  
  197. function smb_neg_prot_cleartext(soc)
  198. {
  199.  neg_prot = raw_string
  200.        (
  201.      0x00,0x00,
  202.      0x00, 0x89, 0xFF, 0x53, 0x4D, 0x42, 0x72, 0x00,
  203.      0x00, 0x00, 0x00, 0x18, 0x01, 0x20, 0x00, 0x00,
  204.      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  205.      0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00,
  206.      g_mlo, g_mhi, 0x00, 0x66, 0x00, 0x02, 0x50, 0x43,
  207.      0x20, 0x4E, 0x45, 0x54, 0x57, 0x4F, 0x52, 0x4B,
  208.      0x20, 0x50, 0x52, 0x4F, 0x47, 0x52, 0x41, 0x4D,
  209.      0x20, 0x31, 0x2E, 0x30, 0x00, 0x02, 0x4D, 0x49,
  210.      0x43, 0x52, 0x4F, 0x53, 0x4F, 0x46, 0x54, 0x20,
  211.      0x4E, 0x45, 0x54, 0x57, 0x4F, 0x52, 0x4B, 0x53,
  212.      0x20, 0x31, 0x2E, 0x30, 0x33, 0x00, 0x02, 0x4D,
  213.      0x49, 0x43, 0x52, 0x4F, 0x53, 0x4F, 0x46, 0x54,
  214.      0x20, 0x4E, 0x45, 0x54, 0x57, 0x4F, 0x52, 0x4B,
  215.      0x53, 0x20, 0x33, 0x2e, 0x30, 0x00, 0x02, 0x4c,
  216.      0x41, 0x4e, 0x4d, 0x41, 0x4e, 0x31, 0x2e, 0x30,
  217.      0x00, 0x02, 0x4c, 0x4d, 0x31, 0x2e, 0x32, 0x58,
  218.      0x30, 0x30, 0x32, 0x00, 0x02, 0x53, 0x61, 0x6d,
  219.      0x62, 0x61, 0x00
  220.      );
  221.      
  222.  send(socket:soc, data:neg_prot);
  223.  r = smb_recv(socket:soc, length:4000);
  224.  if(strlen(r) < 10)return(FALSE);
  225.  if(ord(r[9])==0)return(r);
  226.  else return(FALSE);
  227. }
  228.  
  229.  
  230.  
  231. function smb_neg_prot_NTLMv1(soc)
  232. {
  233.  local_var neg_prot, r;
  234.  
  235.  neg_prot = raw_string
  236.        (
  237.      0x00, 0x00, 0x00, 0xA4, 0xFF, 0x53,
  238.      0x4D, 0x42, 0x72, 0x00, 0x00, 0x00, 0x00, 0x08,
  239.      0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  240.      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  241.      0x4D, 0x0B, 0x00, 0x00, g_mlo, g_mhi, 0x00, 0x81,
  242.      0x00, 0x02
  243.      ) + "PC NETWORK PROGRAM 1.0" + raw_string(0x00, 0x02) +
  244.      "MICROSOFT NETWORKS 1.03" + raw_string(0x00, 0x02) + 
  245.      "MICROSOFT NETWORKS 3.0"  + raw_string(0x00, 0x02) + 
  246.      "LANMAN1.0" + raw_string(0x00, 0x02) + 
  247.      "LM1.2X002" + raw_string(0x00, 0x02) + 
  248.      "Samba" +     raw_string(0x00, 0x02) +
  249.      "NT LANMAN 1.0" + raw_string(0x00, 0x02) +
  250.      "NT LM 0.12" + raw_string(0x00);
  251.      
  252.      
  253.  send(socket:soc, data:neg_prot);
  254.  r = smb_recv(socket:soc, length:4000);
  255.  if(strlen(r) < 38)return(NULL);
  256.  if(ord(r[9])==0)return(string(r));
  257.  else return(NULL);
  258. }
  259.  
  260. function smb_neg_prot(soc)
  261. {
  262.  if(defined_func("MD5"))
  263.    return smb_neg_prot_NTLMv1(soc:soc);
  264.  else 
  265.   return smb_neg_prot_cleartext(soc:soc);
  266. }
  267.  
  268.  
  269. function smb_neg_prot_value(prot)
  270. {
  271.  return(ord(prot[37]));
  272. }
  273.  
  274. function smb_neg_prot_cs(prot)
  275. {
  276.  if(smb_neg_prot_value(prot:prot) < 7)
  277.   return NULL;
  278.   
  279.  return substr(prot, 73, 73 + 7);
  280. }
  281.  
  282. function smb_neg_prot_domain(prot)
  283. {
  284.  local_var i, ret;
  285.  ret = NULL;
  286.  for(i=81;i<strlen(prot);i+=2)
  287.  {
  288.   if(ord(prot[i]) == 0) break;
  289.   else ret += prot[i];
  290.  }
  291.  return ret;
  292. }
  293.  
  294. #------------------------------------------------------#
  295. # Set up a session                                     #
  296. #------------------------------------------------------#
  297. function smb_session_setup_cleartext(soc, login, password, domain)
  298. {
  299.   local_var extra, native_os, native_lanmanager, len, bcc;
  300.   local_var len_hi, len_lo, bcc_hi_n, bcc_lo;
  301.   local_var pass_len_hi, pass_len_lo;
  302.   extra = 0;
  303.   native_os = "Unix";
  304.   native_lanmanager = "Nessus";
  305.   if(!domain)domain = "MYGROUP";
  306.  
  307.   if(domain) extra = 3+ strlen(domain) + strlen(native_os) + strlen(native_lanmanager);
  308.   else extra = strlen(native_os) + strlen(native_lanmanager) + 2;
  309.  
  310.  
  311.   
  312.   len = strlen(login) + strlen(password) + 57 + extra;
  313.   bcc = 2 + strlen(login) + strlen(password) + extra;
  314.   
  315.   len_hi = len / 256;
  316.   len_low = len % 256;
  317.   
  318.   bcc_hi = bcc / 256;
  319.   bcc_lo = bcc % 256;
  320.   
  321.   pass_len = strlen(password) + 1 ;
  322.   pass_len_hi = pass_len / 256;
  323.   pass_len_lo = pass_len % 256;
  324.  
  325.   #if (typeof(login) == "int")    display("HORROR! login=",    login, "\n");
  326.   #if (typeof(password) == "int") display("HORROR! password=", password, "\n");
  327.   if (! login) login="";
  328.   if (! password) password="";
  329.   
  330.   st = raw_string(0x00,0x00,
  331.           len_hi, len_low, 0xFF, 0x53, 0x4D, 0x42, 0x73, 0x00,
  332.       0x00, 0x00, 0x00, 0x18, 0x01, 0x20, 0x00, 0x00,
  333.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  334.       0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00,
  335.       0x00, 0x00, 0x0A, 0xFF, 0x00, 0x00, 0x00, 0x04,
  336.       0x11, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  337.       0x00, pass_len_lo,  pass_len_hi, 0x00, 0x00, 0x00, 0x00, bcc_lo,
  338.       bcc_hi) + password + raw_string(0) + login + raw_string(0x00);
  339.       
  340.   if(domain)
  341.       st = st + domain + raw_string(0x00);    
  342.     
  343.   st = st + native_os + raw_string(0x00) + native_lanmanager + raw_string(0x00);
  344.         
  345.   send(socket:soc, data:st);
  346.   r = smb_recv(socket:soc, length:1024); 
  347.   if(strlen(r) < 9)return(NULL);
  348.   if(ord(r[9])==0)return(r);
  349.   else return(NULL);
  350. }       
  351.  
  352.  
  353. function smb_session_setup_NTLMvN(soc, login, password, domain, cs, version)
  354. {
  355.   local_var extra, native_os, native_lanmanager, len, bcc;
  356.   local_var len_hi, len_lo, bcc_hi_n, bcc_lo;
  357.   local_var plen;
  358.   
  359.   local_var response, pass, i, log, dom, ipass, spass;
  360.  
  361.   pass = log = dom = NULL;
  362.   for (i=0;i < strlen(password);i++)
  363.     pass += password[i] + raw_string(0x00);
  364.  
  365.   for (i=0;i < strlen(login);i++)
  366.     log += login[i] + raw_string(0x00);
  367.  
  368.   for (i=0;i < strlen(domain);i++)
  369.     dom += domain[i] + raw_string(0x00);
  370.  
  371.   ipass = spass = NULL;
  372.  
  373.   if(version == 1)
  374.   {
  375.       if(login && password)
  376.       {
  377.        response = NTLM_Response (password:pass, challenge:cs);
  378.        if (!isnull(response))
  379.            ipass = response[0];
  380.         }
  381.   }
  382.   else 
  383.   {
  384.         if(login && password)
  385.     {
  386.          response = LMv2_Response (password:pass, login:log, domain:dom, challenge:cs);
  387.        if (!isnull(response))
  388.            ipass = response[0];
  389.     }
  390.   }
  391.   
  392.   
  393.   extra = 0;
  394.   native_os = "Unix";
  395.   native_lanmanager = "Nessus";
  396.  
  397.   extra = 3 + strlen(domain) + strlen(native_os) + strlen(native_lanmanager);
  398.   
  399.   
  400.   len = strlen(login) + strlen(ipass) + strlen(spass) + 62 + extra;
  401.   bcc = 1 + strlen(login) + strlen(ipass) + strlen(spass) + extra;
  402.   
  403.   
  404.   len_hi = len / 256;
  405.   len_low = len % 256;
  406.   
  407.   bcc_hi = bcc / 256;
  408.   bcc_lo = bcc % 256;
  409.   
  410.   
  411.   st = raw_string(0x00,0x00,
  412.           len_hi, len_low, 0xFF, 0x53,
  413.       0x4D, 0x42, 0x73, 0x00, 0x00, 0x00, 0x00, 0x08,
  414.       0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  415.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  416.       0x00, 0x28, 0x00, 0x00, g_mlo, g_mhi, 0x0D, 0xFF,
  417.       0x00, 0x00, 0x00, 0x00, 0x44, 0x02, 0x00, 0xA0,
  418.       0xF5, 0x00, 0x00, 0x00, 0x00, strlen(ipass) % 256, 0x00, strlen(spass) % 256,
  419.       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  420.       0x00, bcc_lo, bcc_hi) + ipass + spass + login + 
  421.       raw_string(0);
  422.       
  423.   st += domain + raw_string(0x00);    
  424.     
  425.   st += native_os + raw_string(0x00) + native_lanmanager + raw_string(0x00);
  426.         
  427.   send(socket:soc, data:st);
  428.   r = smb_recv(socket:soc, length:1024); 
  429.   if(strlen(r) < 9)return(FALSE);
  430.   if(ord(r[9])==0)return(r);
  431.   else return(FALSE);
  432. }       
  433.  
  434.  
  435. function smb_session_setup(soc, login, password, domain, prot)
  436. {
  437.  local_var ct, ret, ntlmv1;
  438.  
  439.  ct = get_kb_item("SMB/dont_send_in_cleartext");
  440.  ntlmv1 = get_kb_item("SMB/dont_send_ntlmv1");
  441.  
  442.  if( smb_neg_prot_value(prot:prot) < 7 )
  443.   {
  444.   if(ct == "yes") return NULL;
  445.   else return smb_session_setup_cleartext(soc:soc, login:login, password:password, domain:domain);
  446.   }
  447.  else
  448.   {
  449.   ret = smb_session_setup_NTLMvN(soc:soc, login:login, password:password, domain:domain, cs:smb_neg_prot_cs(prot:prot), version:2);
  450.   if(!ret && !ntlmv1) ret = smb_session_setup_NTLMvN(soc:soc, login:login, password:password, domain:domain, cs:smb_neg_prot_cs(prot:prot), version:1);
  451.   return ret;
  452.   }
  453. }
  454.  
  455.  
  456.  
  457. #------------------------------------------------------#
  458. # connection to a remote share                         #
  459. #------------------------------------------------------#        
  460. #
  461. # connection to the remote IPC share
  462. #        
  463. function smb_tconx(soc,name,uid, share)
  464. {
  465.  
  466.  high = uid / 256;
  467.  low = uid % 256;
  468.  len = 48 + strlen(name) + strlen(share) + 6;
  469.  ulen = 5 + strlen(name) + strlen(share) + 6;
  470.  
  471.  
  472.  
  473.  req = raw_string(0x00, 0x00,
  474.            0x00, len, 0xFF, 0x53, 0x4D, 0x42, 0x75, 0x00,
  475.           0x00, 0x00, 0x00, 0x18, 0x01, 0x20, 0x00, 0x00,
  476.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  477.           0x00, 0x00, 0x00, 0x00, 0x00, 0x28, low, high,
  478.           0x00, 0x00, 0x04, 0xFF, 0x00, 0x00, 0x00, 0x00,
  479.           0x00, 0x01, 0x00, ulen, 0x00, 0x00, 0x5C, 0x5C) +
  480.     name + 
  481.     raw_string(0x5C) + share +raw_string(0x00) +
  482.     "?????"  + raw_string(0x00);
  483.  send(socket:soc, data:req);
  484.  r = smb_recv(socket:soc, length:1024);
  485.  if(strlen(r) < 10)return(FALSE);
  486.  if(ord(r[9])==0)return(r);
  487.  else return(FALSE);                
  488.  
  489. }
  490.  
  491. #------------------------------------------------------#
  492. # Extract the TID from the result of smb_tconx()       #
  493. #------------------------------------------------------#
  494. function tconx_extract_tid(reply)
  495. {
  496.  if(strlen(reply) < 30) return(FALSE);
  497.  low = ord(reply[28]);
  498.  high = ord(reply[29]);
  499.  ret = high * 256;
  500.  ret = ret + low;
  501.  return(ret);
  502. }
  503.  
  504.  
  505. #--------------------------------------------------------#
  506. # Request the creation of a pipe to name. Name must      #
  507. # contain '\'.                                           #
  508. #--------------------------------------------------------#
  509. function smbntcreatex(soc, uid, tid, name, always_return_blob)
  510. {
  511.  tid_high = tid / 256;
  512.  tid_low  = tid % 256;
  513.  
  514.  uid_high = uid / 256;
  515.  uid_low  = uid % 256;
  516.  
  517.   req = raw_string(0xFF, 0x53, 0x4D, 0x42, 0xA2, 0x00,
  518.            0x00, 0x00, 0x00, 0x18, 0x03, 0x00, 0x50, 0x81,
  519.            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  520.            0x00, 0x00, tid_low, tid_high, 0x00, 0x28, uid_low, uid_high,
  521.            g_mlo, g_mhi, 0x18, 0xFF, 0x00, 0x00, 0x00, 0x00,
  522.            0x07, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
  523.            0x00, 0x00, 0x9F, 0x01, 0x02, 0x00, 0x00, 0x00,
  524.            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  525.            0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00,
  526.            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,
  527.            0x00, 0x00, 0x00, (strlen(name)+1) % 256, 0x00)
  528.     + name + raw_string (0x00);
  529.  
  530.  req = raw_string(0x00, 0x00, 0x00, (strlen(req)%256)) + req;
  531.  
  532.  send(socket:soc, data:req);
  533.  r = smb_recv(socket:soc, length:4000);
  534.  if ( always_return_blob ) return r;
  535.  if(strlen(r) < 10)return(FALSE);
  536.  if(ord(r[9])==0x00)return(r);
  537.  else return(FALSE);
  538. }
  539.  
  540.  
  541. #--------------------------------------------------------#
  542. # Extract the ID of our pipe from the result             #
  543. # of smbntcreatex()                                      #
  544. #--------------------------------------------------------#
  545.  
  546. function smbntcreatex_extract_pipe(reply)
  547. {
  548.  if(strlen(reply) < 44) return(FALSE);
  549.  low = ord(reply[42]);
  550.  high = ord(reply[43]);
  551.  
  552.  ret = high * 256;
  553.  ret = ret + low;
  554.  return(ret);
  555. }
  556.  
  557.  
  558.  
  559. #---------------------------------------------------------#
  560. # Determines whether the registry is accessible           #
  561. #---------------------------------------------------------#
  562.         
  563. function pipe_accessible_registry(soc, uid, tid, pipe)
  564. {
  565.  tid_low = tid % 256;
  566.  tid_high = tid / 256;
  567.  uid_low = uid % 256;
  568.  uid_high = uid / 256;
  569.  pipe_low = pipe % 256;
  570.  pipe_high = pipe / 256;
  571.  
  572.  req = raw_string(0x00, 0x00,
  573.            0x00, 0x94, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00,
  574.           0x00, 0x00, 0x00, 0x18, 0x03, 0x00, 0x1B, 0x81,
  575.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  576.           0x00, 0x00, tid_low, tid_high, 0x00, 0x28, uid_low, uid_high,
  577.           g_mlo, g_mhi, 0x10, 0x00, 0x00, 0x48, 0x00, 0x00,
  578.           0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
  579.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C,
  580.           0x00, 0x48, 0x00, 0x4C, 0x00, 0x02, 0x00, 0x26,
  581.           0x00, pipe_low, pipe_high, 0x51, 0x00, 0x5C, 0x50, 0x49,
  582.           0x50, 0x45, 0x5C, 0x00, 0x00, 0x00, 0x05, 0x00,
  583.           0x0B, 0x00, 0x10, 0x00, 0x00, 0x00, 0x48, 0x00,
  584.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x16,
  585.           0x30, 0x16, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
  586.           0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0xd0,
  587.           0x8c, 0x33, 0x44, 0x22, 0xF1, 0x31, 0xAA, 0xAA,
  588.           0x90, 0x00, 0x38, 0x00, 0x10, 0x03, 0x01, 0x00,
  589.           0x00, 0x00, 0x04, 0x5D, 0x88, 0x8A, 0xEB, 0x1C,
  590.           0xc9, 0x11, 0x9F, 0xE8, 0x08, 0x00, 0x2B, 0x10,
  591.           0x48, 0x60, 0x02, 0x00, 0x00, 0x00);      
  592.  send(socket:soc, data:req);
  593.  r = smb_recv(socket:soc, length:4096);
  594.  if(strlen(r) < 10)return(FALSE);
  595.  if(ord(r[9])==0)return(r);
  596.  else return(FALSE);
  597. }
  598.  
  599.  
  600. #----------------------------------------------------------#
  601. # RegOpenHKLM()                                            #
  602. #----------------------------------------------------------#
  603.  
  604. function registry_open_hklm(soc, uid, tid, pipe)
  605. {
  606.  local_var req, tid_low, tid_high, uid_low, uid_high, pipe_low, pipe_high, r;
  607.  
  608.  tid_low = tid % 256;
  609.  tid_high = tid / 256;
  610.  uid_low = uid % 256;
  611.  uid_high = uid / 256;
  612.  pipe_low = pipe % 256;
  613.  pipe_high = pipe / 256;
  614.  
  615.  req = raw_string(0x00, 0x00,
  616.            0x00, 0x78, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00,
  617.           0x00, 0x00, 0x00, 0x18, 0x03, 0x80, 0x1D, 0x83,
  618.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  619.           0x00, 0x00, tid_low, tid_high, 0x00, 0x28, uid_low, uid_high,
  620.           g_mlo, g_mhi, 0x10, 0x00, 0x00, 0x24, 0x00, 0x00,
  621.           0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
  622.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54,
  623.           0x00, 0x24, 0x00, 0x54, 0x00, 0x02, 0x00, 0x26,
  624.           0x00, pipe_low, pipe_high, 0x35, 0x00, 0x00, 0x5c, 0x00,
  625.           0x50, 0x00, 0x49, 0x00, 0x50, 0x00, 0x45, 0x00,
  626.           0x5C, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x05, 0x00,
  627.           0x00, 0x03, 0x10, 0x00, 0x00, 0x00, 0x24, 0x00,
  628.           0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00,
  629.           0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0xFF,
  630.           0x12, 0x00, 0x30, 0x39, 0x01, 0x00, 0x00, 0x00,
  631.           0x00, 0x02);
  632.           
  633.  
  634.  send(socket:soc, data:req);
  635.  r = smb_recv(socket:soc, length:4096);
  636.  if(strlen(r) < 10)return(FALSE);
  637.  if(ord(r[9])==0)return(r);
  638.  else return(FALSE);
  639. }
  640.  
  641. #----------------------------------------------------------#
  642. # RegOpenHKU()                                             #
  643. #----------------------------------------------------------#
  644. function registry_open_hku(soc, uid, tid, pipe)
  645. {
  646.  local_var req, tid_low, tid_high, uid_low, uid_high, pipe_low, pipe_high, r;
  647.  
  648.  tid_low = tid % 256;
  649.  tid_high = tid / 256;
  650.  uid_low = uid % 256;
  651.  uid_high = uid / 256;
  652.  pipe_low = pipe % 256;
  653.  pipe_high = pipe / 256;
  654.  
  655.  req = raw_string(0x00, 0x00,
  656.            0x00, 0x78, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00,
  657.           0x00, 0x00, 0x00, 0x18, 0x03, 0x80, 0x1D, 0x83,
  658.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  659.           0x00, 0x00, tid_low, tid_high, 0x00, 0x28, uid_low, uid_high,
  660.           g_mlo, g_mhi, 0x10, 0x00, 0x00, 0x24, 0x00, 0x00,
  661.           0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
  662.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54,
  663.           0x00, 0x24, 0x00, 0x54, 0x00, 0x02, 0x00, 0x26,
  664.           0x00, pipe_low, pipe_high, 0x35, 0x00, 0x00, 0x5c, 0x00,
  665.           0x50, 0x00, 0x49, 0x00, 0x50, 0x00, 0x45, 0x00,
  666.           0x5C, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x05, 0x00,
  667.           0x00, 0x03, 0x10, 0x00, 0x00, 0x00, 0x24, 0x00,
  668.           0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00,
  669.           0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x10, 0xFF,
  670.           0x12, 0x00, 0x30, 0x39, 0x01, 0x00, 0x00, 0x00,
  671.           0x00, 0x02);
  672.           
  673.  
  674.  send(socket:soc, data:req);
  675.  r = smb_recv(socket:soc, length:4096);
  676.  if(strlen(r) < 10)return(FALSE);
  677.  if(ord(r[9])==0)return(r);
  678.  else return(FALSE);
  679. }
  680. #----------------------------------------------------------#
  681. # RegOpenHKCR()                                            #
  682. #----------------------------------------------------------#
  683. function registry_open_hkcr(soc, uid, tid, pipe)
  684. {
  685.  local_var req, tid_low, tid_high, uid_low, uid_high, pipe_low, pipe_high, r;
  686.  
  687.  tid_low = tid % 256;
  688.  tid_high = tid / 256;
  689.  uid_low = uid % 256;
  690.  uid_high = uid / 256;
  691.  pipe_low = pipe % 256;
  692.  pipe_high = pipe / 256;
  693.  
  694.  req = raw_string(0x00, 0x00,
  695.            0x00, 0x78, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00,
  696.           0x00, 0x00, 0x00, 0x18, 0x03, 0x80, 0x1D, 0x83,
  697.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  698.           0x00, 0x00, tid_low, tid_high, 0x00, 0x28, uid_low, uid_high,
  699.           g_mlo, g_mhi, 0x10, 0x00, 0x00, 0x24, 0x00, 0x00,
  700.           0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
  701.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54,
  702.           0x00, 0x24, 0x00, 0x54, 0x00, 0x02, 0x00, 0x26,
  703.           0x00, pipe_low, pipe_high, 0x35, 0x00, 0x00, 0x5c, 0x00,
  704.           0x50, 0x00, 0x49, 0x00, 0x50, 0x00, 0x45, 0x00,
  705.           0x5C, 0x00, 0x00, 0x00, 0x00, 0x5c, 0x05, 0x00,
  706.           0x00, 0x03, 0x10, 0x00, 0x00, 0x00, 0x24, 0x00,
  707.           0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0C, 0x00,
  708.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xFF,
  709.           0x12, 0x00, 0x30, 0x39, 0x01, 0x00, 0x00, 0x00,
  710.           0x00, 0x02);
  711.           
  712.  
  713.  send(socket:soc, data:req);
  714.  r = smb_recv(socket:soc, length:4096);
  715.  if(strlen(r) < 10)return(FALSE);
  716.  if(ord(r[9])==0)return(r);
  717.  else return(FALSE);
  718. }
  719. #----------------------------------------------------------#
  720. # RegFlush()                           #
  721. #----------------------------------------------------------#
  722. function registry_flush(soc, uid, tid, pipe, reply)
  723. {
  724.  local_var magic, req, r, tid_low, tid_high, uid_low, uid_high, pipe_low, pipe_high, name, data, i, len;
  725.  
  726.  tid_low = tid % 256;
  727.  tid_high = tid / 256;
  728.  
  729.  uid_low = uid % 256;
  730.  uid_high = uid / 256;
  731.  
  732.  pipe_low = pipe % 256;
  733.  pipe_high = pipe / 256;
  734.  
  735.  magic = raw_string(ord(reply[84]));          
  736.  for(i=1;i<20;i=i+1)
  737.  {
  738.   magic = magic + raw_string(ord(reply[84+i]));
  739.  }
  740.  
  741.  req = raw_string(0x00, 0x00, 0x00, 0x78, 0xFF, 0x53, 
  742.           0x4D, 0x42, 0x25, 0x00, 0x00, 0x00, 0x00, 0x08,
  743.           0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  744.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, tid_low, tid_high,
  745.           0x00, 0x28, uid_low, uid_high, g_mlo, g_mhi, 0x10, 0x00,
  746.           0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
  747.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  748.           0x00, 0x00, 0x00, 0x4c, 0x00, 0x2c, 0x00, 0x4c,
  749.           0x00, 0x02, 0x00, 0x26, 0x00, pipe_low, pipe_high, 0x35,
  750.           0x00, 0x5c, 0x50, 0x49, 0x50, 0x45, 0x5c, 0x00,
  751.           0x00, 0x00, 0x05, 0x00, 0x00, 0x03, 0x10, 0x00,
  752.           0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0xcf, 0x01,
  753.           0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
  754.           0x0b, 0x00) + magic;
  755.           
  756.           
  757.           
  758.  send(socket:soc, data:req);
  759.  r = smb_recv(socket:soc, length:65535);
  760.  return substr(r, strlen(r) - 4, strlen(r) - 1);
  761. }
  762.   
  763. #----------------------------------------------------------#
  764. # RegClose()                                               #
  765. #----------------------------------------------------------#
  766.  
  767. function registry_close(soc, uid, tid, pipe, reply)
  768. {
  769.  local_var magic, req, r, tid_low, tid_high, uid_low, uid_high, pipe_low, pipe_high, name, data, i, len;
  770.  
  771.  tid_low = tid % 256;
  772.  tid_high = tid / 256;
  773.  
  774.  uid_low = uid % 256;
  775.  uid_high = uid / 256;
  776.  
  777.  pipe_low = pipe % 256;
  778.  pipe_high = pipe / 256;
  779.  
  780.  magic = raw_string(ord(reply[84]));          
  781.  for(i=1;i<20;i=i+1)
  782.  {
  783.   magic = magic + raw_string(ord(reply[84+i]));
  784.  }
  785.  
  786.  req = raw_string(0x00, 0x00, 0x00, 0x78, 0xFF, 0x53, 
  787.           0x4D, 0x42, 0x25, 0x00, 0x00, 0x00, 0x00, 0x08,
  788.           0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  789.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, tid_low, tid_high,
  790.           0x00, 0x28, uid_low, uid_high, g_mlo, g_mhi, 0x10, 0x00,
  791.           0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
  792.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  793.           0x00, 0x00, 0x00, 0x4c, 0x00, 0x2c, 0x00, 0x4c,
  794.           0x00, 0x02, 0x00, 0x26, 0x00, pipe_low, pipe_high, 0x35,
  795.           0x00, 0x5c, 0x50, 0x49, 0x50, 0x45, 0x5c, 0x00,
  796.           0x00, 0x00, 0x05, 0x00, 0x00, 0x03, 0x10, 0x00,
  797.           0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0xcf, 0x01,
  798.           0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
  799.           0x05, 0x00) + magic;
  800.           
  801.           
  802.           
  803.  send(socket:soc, data:req);
  804.  r = smb_recv(socket:soc, length:65535);
  805.  return substr(r, strlen(r) - 4, strlen(r) - 1);
  806. }
  807.  
  808. #----------------------------------------------------------#
  809. # RegDelKey()                           #
  810. #----------------------------------------------------------#
  811.  
  812. function registry_delete_key(soc, uid, tid, pipe, key, reply )
  813. {
  814.  local_var _na_start, i, error;
  815.  
  816.  key_len = strlen(key) + 1;
  817.  key_len_hi = key_len / 256;
  818.  key_len_lo = key_len % 256;
  819.  
  820.  
  821.  tid_low = tid % 256;
  822.  tid_high = tid / 256;
  823.  uid_low = uid % 256;
  824.  uid_high = uid / 256;
  825.  pipe_low = pipe % 256;
  826.  pipe_high = pipe / 256;
  827.  uc = unicode3(data:key);
  828.  
  829.  len = 148 + strlen(uc);
  830.  
  831.  len_hi = len / 256;
  832.  len_lo = len % 256;
  833.  
  834.  
  835.  z = 40 + strlen(uc);
  836.  z_lo = z % 256;
  837.  z_hi = z / 256;
  838.  
  839.  y = 81 + strlen(uc);
  840.  y_lo = y % 256;
  841.  y_hi = y / 256;
  842.  
  843.  x = 64 + strlen(uc);
  844.  x_lo = x % 256;
  845.  x_hi = x / 256;
  846.  
  847.  if(strlen(reply) < 17)exit(0);
  848.  magic1 = raw_string(ord(reply[16]), ord(reply[17]));
  849.  
  850.  req = raw_string(0x00, 0x00,
  851.            len_hi, len_lo, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00,
  852.           0x00, 0x00, 0x00, 0x18, 0x03, 0x80)
  853.           +
  854.           magic1 +
  855.          raw_string(
  856.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  857.           0x00, 0x00,tid_low, tid_high, 0x00, 0x28, uid_low, uid_high,
  858.           g_mlo, g_mhi, 0x10, 0x00, 0x00, x_lo, x_hi, 0x00,
  859.           0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
  860.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54,
  861.           0x00, x_lo, x_hi, 0x54, 0x00, 0x02, 0x00, 0x26,
  862.           0x00, pipe_low, pipe_high, y_lo, y_hi, 0x00, 0x5C, 0x00,
  863.           0x50, 0x00, 0x49, 0x00, 0x50, 0x00, 0x45, 0x00,
  864.           0x5C, 0x00, 0x00, 0x00, 0x00, 0xb9, 0x05, 0x00,
  865.           0x00, 0x03, 0x10, 0x00, 0x00, 0x00, x_lo, x_hi,
  866.           0x00, 0x00, 0x02, 0x00, 0x00, 0x00, z_lo, z_hi,
  867.           0x00, 0x00, 0x00, 0x00, 0x07, 0x00);
  868.           
  869.  magic = raw_string(ord(reply[84]));
  870.  for(i=1;i<20;i=i+1)
  871.  {
  872.   magic = magic + raw_string(ord(reply[84+i]));
  873.  }
  874.  
  875.  x = strlen(key) + strlen(key) + 2;
  876.  x_lo = x % 256;
  877.  x_hi = x / 256;
  878.  
  879.  req = req + magic + raw_string(x_lo, x_hi, x_lo, x_hi, 0x01, 0x00,
  880.          0x00, 0x00, key_len_lo, key_len_hi, 0x00, 0x00, 0x00,
  881.         0x00, 0x00, 0x00, key_len_lo, key_len_hi, 0x00) +
  882.         uc + raw_string(0);
  883.           
  884.  
  885.  send(socket:soc, data:req);
  886.  r = smb_recv(socket:soc, length:4096);
  887.  if(strlen(r) < 10)return(1);
  888.  error = substr(r, strlen(r) - 4, strlen(r) - 1);
  889.  return ( ( int(ord(error[3])) * 256 + int(ord(error[2])) ) * 256 + int(ord(error[1])) * 256 ) + int(ord(error[0]));
  890. }
  891. #----------------------------------------------------------#
  892. # RegDelValue()                           #
  893. #----------------------------------------------------------#
  894.  
  895. function registry_delete_value(soc, uid, tid, pipe, value, reply )
  896. {
  897.  local_var _na_start, i, error;
  898.  
  899.  key_len = strlen(value) + 1;
  900.  key_len_hi = key_len / 256;
  901.  key_len_lo = key_len % 256;
  902.  
  903.  
  904.  tid_low = tid % 256;
  905.  tid_high = tid / 256;
  906.  uid_low = uid % 256;
  907.  uid_high = uid / 256;
  908.  pipe_low = pipe % 256;
  909.  pipe_high = pipe / 256;
  910.  uc = unicode3(data:value);
  911.  
  912.  len = 148 + strlen(uc);
  913.  
  914.  len_hi = len / 256;
  915.  len_lo = len % 256;
  916.  
  917.  
  918.  z = 40 + strlen(uc);
  919.  z_lo = z % 256;
  920.  z_hi = z / 256;
  921.  
  922.  y = 81 + strlen(uc);
  923.  y_lo = y % 256;
  924.  y_hi = y / 256;
  925.  
  926.  x = 64 + strlen(uc);
  927.  x_lo = x % 256;
  928.  x_hi = x / 256;
  929.  
  930.  if(strlen(reply) < 17)exit(0);
  931.  magic1 = raw_string(ord(reply[16]), ord(reply[17]));
  932.  
  933.  req = raw_string(0x00, 0x00,
  934.            len_hi, len_lo, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00,
  935.           0x00, 0x00, 0x00, 0x18, 0x03, 0x80)
  936.           +
  937.           magic1 +
  938.          raw_string(
  939.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  940.           0x00, 0x00,tid_low, tid_high, 0x00, 0x28, uid_low, uid_high,
  941.           g_mlo, g_mhi, 0x10, 0x00, 0x00, x_lo, x_hi, 0x00,
  942.           0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
  943.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54,
  944.           0x00, x_lo, x_hi, 0x54, 0x00, 0x02, 0x00, 0x26,
  945.           0x00, pipe_low, pipe_high, y_lo, y_hi, 0x00, 0x5C, 0x00,
  946.           0x50, 0x00, 0x49, 0x00, 0x50, 0x00, 0x45, 0x00,
  947.           0x5C, 0x00, 0x00, 0x00, 0x00, 0xb9, 0x05, 0x00,
  948.           0x00, 0x03, 0x10, 0x00, 0x00, 0x00, x_lo, x_hi,
  949.           0x00, 0x00, 0x97, 0x00, 0x00, 0x00, z_lo, z_hi,
  950.           0x00, 0x00, 0x00, 0x00, 0x08, 0x00);
  951.           
  952.  magic = raw_string(ord(reply[84]));
  953.  for(i=1;i<20;i=i+1)
  954.  {
  955.   magic = magic + raw_string(ord(reply[84+i]));
  956.  }
  957.  
  958.  x = strlen(value) + strlen(value) + 2;
  959.  x_lo = x % 256;
  960.  x_hi = x / 256;
  961.  
  962.  req = req + magic + raw_string(x_lo, x_hi, x_lo, x_hi, 0x01, 0x00,
  963.          0x00, 0x00, key_len_lo, key_len_hi, 0x00, 0x00, 0x00,
  964.         0x00, 0x00, 0x00, key_len_lo, key_len_hi, 0x00) +
  965.         uc + raw_string(0);
  966.           
  967.  
  968.  send(socket:soc, data:req);
  969.  r = smb_recv(socket:soc, length:4096);
  970.  if(strlen(r) < 10)return(1);
  971.  error = substr(r, strlen(r) - 4, strlen(r) - 1);
  972.  
  973.  return ( ( int(ord(error[3])) * 256 + int(ord(error[2])) ) * 256 + int(ord(error[1])) * 256 ) + int(ord(error[0]));
  974. }
  975. #--------------------------------------------------------------#
  976. # RegShutdown()                                                #
  977. #--------------------------------------------------------------#
  978. function registry_shutdown(soc, uid, tid, pipe, message, timeout, reboot, closeapps )
  979. {
  980.  local_var _na_start, i, error, msg_len, msg_len_hi, msg_len_lo, tid_low, tid_high, uid_low, uid_high, pipe_low, pipe_high, uc;
  981.  
  982.  msg_len = strlen(message) + 1;
  983.  msg_len_hi = msg_len / 256;
  984.  msg_len_lo = msg_len % 256;
  985.  
  986.  
  987.  tid_low = tid % 256;
  988.  tid_high = tid / 256;
  989.  uid_low = uid % 256;
  990.  uid_high = uid / 256;
  991.  pipe_low = pipe % 256;
  992.  pipe_high = pipe / 256;
  993.  uc = unicode4(data:message);
  994.  
  995.  len = 146 + strlen(uc);
  996.  
  997.  len_hi = len / 256;
  998.  len_lo = len % 256;
  999.  
  1000.  
  1001.  z = 38 + strlen(uc);
  1002.  z_lo = z % 256;
  1003.  z_hi = z / 256;
  1004.  
  1005.  y = 79 + strlen(uc);
  1006.  y_lo = y % 256;
  1007.  y_hi = y / 256;
  1008.  
  1009.  x = 62 + strlen(uc);
  1010.  x_lo = x % 256;
  1011.  x_hi = x / 256;
  1012.  
  1013.  
  1014.  req = raw_string(0x00, 0x00,
  1015.            len_hi, len_lo, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00,
  1016.           0x00, 0x00, 0x00, 0x18, 0x03, 0x80, 0x00, 0x00 ) +
  1017.          raw_string(
  1018.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1019.           0x00, 0x00,tid_low, tid_high, 0x00, 0x28, uid_low, uid_high,
  1020.           g_mlo, g_mhi, 0x10, 0x00, 0x00, x_lo, x_hi, 0x00,
  1021.           0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
  1022.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54,
  1023.           0x00, x_lo, x_hi, 0x54, 0x00, 0x02, 0x00, 0x26,
  1024.           0x00, pipe_low, pipe_high, y_lo, y_hi, 0x00, 0x5C, 0x00,
  1025.           0x50, 0x00, 0x49, 0x00, 0x50, 0x00, 0x45, 0x00,
  1026.           0x5C, 0x00, 0x00, 0x00, 0x00, 0xb9, 0x05, 0x00,
  1027.           0x00, 0x03, 0x10, 0x00, 0x00, 0x00, x_lo, x_hi,
  1028.           0x00, 0x00, 0x02, 0x00, 0x00, 0x00, z_lo, z_hi,
  1029.           0x00, 0x00, 0x00, 0x00, 0x18, 0x00);
  1030.  
  1031.  x = strlen(message) + strlen(message);
  1032.  x_lo = x % 256;
  1033.  x_hi = x / 256;
  1034.  y = x + 2;
  1035.  y_lo = y % 256;
  1036.  y_hi = y / 256;
  1037.  
  1038.  msg_len2 = msg_len - 1;
  1039.  msg_len2_lo = msg_len2 % 256;
  1040.  msg_len2_hi = msg_len2 / 256;
  1041.  
  1042.  req += raw_string( 0x01, 0x00, 0x00, 0x00,  # ptr_1
  1043.             0x01, 0x00, 0x00, 0x00,  # ptr_2
  1044.             0x01, 0x00, 0x00, 0x00,  # ptr_3
  1045.             x_lo, x_hi,             # uni_str_len
  1046.             y_lo, y_hi,             # max_str_len
  1047.             0x01, 0x00, 0x00, 0x00,  # buffer
  1048.             msg_len_lo, msg_len_hi, 0x00, 0x00,  # uni_max_len
  1049.             0x00, 0x00, 0x00, 0x00 , # undoc
  1050.             msg_len2_lo, msg_len2_hi, 0x00, 0x00  # str_max_len
  1051.      );
  1052.             
  1053.           
  1054.  req += uc;
  1055.  req += raw_string(timeout % 256, (timeout/256) % 256, (timeout/(256*256)) % 256, timeout / (256*256*256));
  1056.  
  1057.  
  1058.  if ( closeapps ) req += raw_string(0x01);
  1059.  else req += raw_string(0x00);
  1060.  
  1061.  if ( reboot ) req += raw_string(0x01);
  1062.  else req += raw_string(0x00);
  1063.  
  1064.           
  1065.  
  1066.  send(socket:soc, data:req);
  1067.  r = smb_recv(socket:soc, length:4096);
  1068.  if(strlen(r) < 10)return(1);
  1069.  error = substr(r, strlen(r) - 4, strlen(r) - 1);
  1070.  return ( ( int(ord(error[3])) * 256 + int(ord(error[2])) ) * 256 + int(ord(error[1])) * 256 ) + int(ord(error[0]));
  1071. }
  1072. #----------------------------------------------------------#
  1073. # RegEnumKey()                                             #
  1074. #----------------------------------------------------------#
  1075. function registry_enum_key(soc, uid, tid, pipe, reply)
  1076. {
  1077.  
  1078.  local_var magic, req, r, tid_low, tid_high, uid_low, uid_high, pipe_low, pipe_high, name, data, list, i, j;
  1079.  
  1080.  list = make_list();
  1081.  tid_low = tid % 256;
  1082.  tid_high = tid / 256;
  1083.  
  1084.  uid_low = uid % 256;
  1085.  uid_high = uid / 256;
  1086.  
  1087.  pipe_low = pipe % 256;
  1088.  pipe_high = pipe / 256;
  1089.  
  1090.  magic = raw_string(ord(reply[84]));          
  1091.  for(i=1;i<20;i=i+1)
  1092.  {
  1093.   magic = magic + raw_string(ord(reply[84+i]));
  1094.  }
  1095.  
  1096.  for(j=0;j>=0;j++)
  1097.  {
  1098.  req = raw_string(0x00, 0x00, 0x00, 0xa8, 0xFF, 0x53, 
  1099.           0x4D, 0x42, 0x25, 0x00, 0x00, 0x00, 0x00, 0x08,
  1100.           0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1101.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, tid_low, tid_high,
  1102.           0x00, 0x28, uid_low, uid_high, g_mlo, g_mhi, 0x10, 0x00,
  1103.           0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
  1104.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1105.           0x00, 0x00, 0x00, 0x4c, 0x00, 0x5c, 0x00, 0x4c,
  1106.           0x00, 0x02, 0x00, 0x26, 0x00, pipe_low, pipe_high, 0x65,
  1107.           0x00, 0x5c, 0x50, 0x49, 0x50, 0x45, 0x5c, 0x00,
  1108.           0x00, 0x00, 0x05, 0x00, 0x00, 0x03, 0x10, 0x00,
  1109.           0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0xff, 0x00,
  1110.           0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00,
  1111.           0x09, 0x00); 
  1112.           
  1113.           
  1114.           
  1115.   req2= magic + raw_string(
  1116.                   j % 256, j / 256, 0x00, 0x00,  # key ID
  1117.           0x00, 0x00,             # key name len
  1118.           0x14, 0x04,              # unknown
  1119.                   0x01, 0x00, 0x00, 0x00,   # ptr
  1120.           0x0a, 0x02, 0x00, 0x00,   # unknown_2
  1121.                   0x00, 0x00, 0x00, 0x00,   # padding
  1122.           0x00, 0x00, 0x00, 0x00,   # padding
  1123.                   0x01, 0x00, 0x00, 0x00,   # ptr2
  1124.                   0x00, 0x00, 0x00, 0x00,   # padding2
  1125.                   0x00, 0x00, 0x00, 0x00,   # padding2
  1126.           0x01, 0x00, 0x00, 0x00,   # ptr3 
  1127.           0xff, 0xff, 0xff, 0xff,   # smb_io_time low
  1128.               0xff, 0xff, 0xff, 0x7f   # smb_io_time high
  1129.           );
  1130.  
  1131.     
  1132.  req += req2;
  1133.  send(socket:soc, data:req);
  1134.  r = smb_recv(socket:soc, length:65535);
  1135.  if(strlen(r) < 80)return(NULL);
  1136.  
  1137.  len = ord(r[60+24+16]);
  1138.  if (!len)
  1139.    break;
  1140.  
  1141.  name = "";
  1142.  for (i=0;i<len - 1; i++)
  1143.     name += r[60+43+i*2+1];
  1144.  
  1145.  list = make_list(list, name);
  1146.  }
  1147.  
  1148.  return list;
  1149. }
  1150.  
  1151.  
  1152. #----------------------------------------------------------#
  1153. # RegEnumValue()                                           #
  1154. #----------------------------------------------------------#
  1155. # Author: Nicolas Pouvesle
  1156. function registry_enum_value(soc, uid, tid, pipe, reply)
  1157. {
  1158.  local_var magic, req, r, tid_low, tid_high, uid_low, uid_high, pipe_low, pipe_high, name, data, list, i, j;
  1159.  
  1160.  tid_low = tid % 256;
  1161.  tid_high = tid / 256;
  1162.  
  1163.  uid_low = uid % 256;
  1164.  uid_high = uid / 256;
  1165.  
  1166.  pipe_low = pipe % 256;
  1167.  pipe_high = pipe / 256;
  1168.  
  1169.  magic = raw_string(ord(reply[84]));          
  1170.  for(i=1;i<20;i=i+1)
  1171.  {
  1172.   magic = magic + raw_string(ord(reply[84+i]));
  1173.  }
  1174.  
  1175.  for(j=0;j>=0;j++)
  1176.  {
  1177.  req = raw_string(0x00, 0x00,
  1178.            0x00, 0xC0, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00,
  1179.           0x00, 0x00, 0x00, 0x18, 0x03, 0x80, 0x00, 0x83,
  1180.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1181.           0x00, 0x00, tid_low, tid_high, 0x00, 0x28, uid_low, uid_high,
  1182.           g_mlo, g_mhi, 0x10, 0x00, 0x00, 0x6C, 0x00, 0x00,
  1183.           0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
  1184.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54,
  1185.           0x00, 0x6C, 0x00, 0x54, 0x00, 0x02, 0x00, 0x26,
  1186.           0x00, pipe_low, pipe_high, 0x59, 0x00, 0x00, 0x5C, 0x00,
  1187.           0x50, 0x00, 0x49, 0x00, 0x50, 0x00, 0x45, 0x00,
  1188.           0x5C, 0x00, 0x00, 0x00, 0xEE, 0xD5, 0x05, 0x00,
  1189.           0x00, 0x03, 0x10, 0x00, 0x00, 0x00, 0x6C, 0x00,
  1190.           0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x30, 0x00,
  1191.           0x00, 0x00, 0x00, 0x00, 0x0A, 0x00);
  1192.           
  1193.   req = req + magic + raw_string(
  1194.                   j % 256, j / 256, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
  1195.                   0xcc, 0xf9, 0x06, 0x00, 0x00, 0x01, 0x00, 0x00,
  1196.                   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1197.                   0xa0, 0xf9, 0x06, 0x00, 0x59, 0xe6, 0x07, 0x00,
  1198.                   0x00, 0xc4, 0x04, 0x01, 0x00, 0x80, 0x00, 0x00,
  1199.                   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1200.                   0xb0, 0xf9, 0x06, 0x00, 0x00, 0x80, 0x00, 0x00,
  1201.                   0x94, 0xf9, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00); 
  1202.  
  1203.     
  1204.  send(socket:soc, data:req);
  1205.  r = smb_recv(socket:soc, length:65535);
  1206.  if(strlen(r) < 80)return(NULL);
  1207.  
  1208.  len = ord(r[60+24]);
  1209.  if (!len)
  1210.    break;
  1211.  
  1212.  name = "";
  1213.  for (i=0;i<len;i = i+2)
  1214.     name += r[60+43+i+1];
  1215.  
  1216.  if (!ord(r[60+43+len+2])) len+=2;
  1217.  
  1218.  dlen = ord(r[60+43+len+21]);
  1219.  
  1220.  data = "";
  1221.  for (i=0;i<dlen;i = i+2)
  1222.     data += r[60+43+len+24+i+1];
  1223.  
  1224.  list[j*2] = name;
  1225.  list[j*2+1] = data;
  1226.  }
  1227.  
  1228.  return list;
  1229. }
  1230. #---------------------------------------------------------------------#
  1231. # RegOpenKey()                                  #
  1232. #---------------------------------------------------------------------#
  1233.          
  1234. function registry_get_key(soc, uid, tid, pipe, key, reply, write)
  1235. {
  1236.  local_var _na_start, i, error, access_mask;
  1237.  
  1238.  key_len = strlen(key) + 1;
  1239.  key_len_hi = key_len / 256;
  1240.  key_len_lo = key_len % 256;
  1241.  
  1242.  
  1243.  
  1244.  tid_low = tid % 256;
  1245.  tid_high = tid / 256;
  1246.  uid_low = uid % 256;
  1247.  uid_high = uid / 256;
  1248.  pipe_low = pipe % 256;
  1249.  pipe_high = pipe / 256;
  1250.  uc = unicode(data:key);
  1251.  
  1252.  if ( write ) access_mask = raw_string(0x19, 0x00, 0x02, 0x02);
  1253.  else access_mask = raw_string(0x19, 0x00, 0x02, 0x00);
  1254.  
  1255.  uc += access_mask;
  1256.  len = 148 + strlen(uc);
  1257.  
  1258.  len_hi = len / 256;
  1259.  len_lo = len % 256;
  1260.  
  1261.  
  1262.  z = 40 + strlen(uc);
  1263.  z_lo = z % 256;
  1264.  z_hi = z / 256;
  1265.  
  1266.  y = 81 + strlen(uc);
  1267.  y_lo = y % 256;
  1268.  y_hi = y / 256;
  1269.  
  1270.  x = 64 + strlen(uc);
  1271.  x_lo = x % 256;
  1272.  x_hi = x / 256;
  1273.  
  1274.  if(strlen(reply) < 17)exit(0);
  1275.  magic1 = raw_string(ord(reply[16]), ord(reply[17]));
  1276.  
  1277.  req = raw_string(0x00, 0x00,
  1278.            len_hi, len_lo, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00,
  1279.           0x00, 0x00, 0x00, 0x18, 0x03, 0x80)
  1280.           +
  1281.           magic1 +
  1282.          raw_string(
  1283.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1284.           0x00, 0x00,tid_low, tid_high, 0x00, 0x28, uid_low, uid_high,
  1285.           g_mlo, g_mhi, 0x10, 0x00, 0x00, x_lo, x_hi, 0x00,
  1286.           0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
  1287.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54,
  1288.           0x00, x_lo, x_hi, 0x54, 0x00, 0x02, 0x00, 0x26,
  1289.           0x00, pipe_low, pipe_high, y_lo, y_hi, 0x00, 0x5C, 0x00,
  1290.           0x50, 0x00, 0x49, 0x00, 0x50, 0x00, 0x45, 0x00,
  1291.           0x5C, 0x00, 0x00, 0x00, 0x00, 0xb9, 0x05, 0x00,
  1292.           0x00, 0x03, 0x10, 0x00, 0x00, 0x00, x_lo, x_hi,
  1293.           0x00, 0x00, 0x02, 0x00, 0x00, 0x00, z_lo, z_hi,
  1294.           0x00, 0x00, 0x00, 0x00, 0x0F, 0x00);
  1295.           
  1296.  magic = raw_string(ord(reply[84]));
  1297.  for(i=1;i<20;i=i+1)
  1298.  {
  1299.   magic = magic + raw_string(ord(reply[84+i]));
  1300.  }
  1301.  
  1302.  x = strlen(key) + strlen(key) + 2;
  1303.  x_lo = x % 256;
  1304.  x_hi = x / 256;
  1305.  
  1306.  req = req + magic + raw_string(x_lo, x_hi, 0x0A, 0x02, 0x00, 0xEC,
  1307.          0xFD, 0x7F, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00,
  1308.         0x00, 0x00, key_len_lo, key_len_hi, 0x00, 0x00) +
  1309.         uc;
  1310.           
  1311.  
  1312.  send(socket:soc, data:req);
  1313.  r = smb_recv(socket:soc, length:4096);
  1314.  if(strlen(r) < 10)return(FALSE);
  1315.  
  1316.  len = ord(r[2])*256;
  1317.  len = len + ord(r[3]);
  1318.  if(len < 100)return(FALSE);
  1319.  
  1320.   # pull the last 4 bytes off the end
  1321.  _na_start = (strlen(r) - 4);
  1322.  for (_na_cnt = 0; _na_cnt < 4; _na_cnt++)
  1323.      _na_data = _na_data + r[_na_start + _na_cnt];
  1324.  
  1325.  # access denied, returned by Windows XP+
  1326.  if (_na_data == raw_string(0x05,0x00,0x00,0x00) || _na_data == raw_string(0x02, 0x00, 0x00, 0x00))
  1327.     return(FALSE);
  1328.  
  1329.  if(ord(r[9])==0)return(r);
  1330.  else return(FALSE);
  1331. }
  1332.  
  1333.  
  1334.  
  1335. #------------------------------------------------------------------#
  1336. # Return TRUE if someone else than the admin group, the owner      #
  1337. # and the local system can modify the key                          #
  1338. #------------------------------------------------------------------#
  1339.  
  1340. function registry_key_writeable_by_non_admin(security_descriptor)
  1341. {
  1342.  local_var r, num_aces, size, start, s, i, mask, z, id_auth, num_auth, sub_auth, k, n, sid;
  1343.  local_var WRITE, ADMIN_SID, LOCAL_SYSTEM_SID, CREATOR_OWNER_SID; 
  1344.  
  1345.  
  1346.   if(isnull(security_descriptor))
  1347.       return(NULL);
  1348.     
  1349.   # write mask
  1350.  WRITE = 0x00010000 | 0x00040000 | 0x00080000 | 0x00000002 | 0x000004;
  1351.  
  1352.  # sids - written the nessus way
  1353.  
  1354.  ADMIN_SID = "1-000005-32-544";
  1355.  LOCAL_SYSTEM_SID = "1-000005-18";
  1356.  CREATOR_OWNER_SID = "1-000003-0";
  1357.  
  1358.  
  1359.  r = security_descriptor;
  1360.  num_aces = 0;
  1361.  num_aces = ord(r[135]);
  1362.  num_aces = ord(r[134])+ num_aces*256;
  1363.  num_aces = ord(r[133])+ num_aces*256;
  1364.  num_aces = ord(r[132])+ num_aces*256;
  1365.  start = 137;
  1366.  
  1367.  size = 0;
  1368.  s = start;
  1369.  
  1370.  for(i=0;i<num_aces;i=i+1)
  1371.  {
  1372.   z = ord(r[s+2]);
  1373.   z = ord(r[s+1])+z*256;
  1374.   mask = ord(r[s+6]);
  1375.   mask = ord(r[s+5])+mask*256;
  1376.   mask = ord(r[s+4])+mask*256;
  1377.   mask = ord(r[s+3])+mask*256;
  1378.   
  1379.   id_auth = ord(r[s+14]);
  1380.   id_auth = string(ord(r[s+13]), id_auth);
  1381.   id_auth = string(ord(r[s+12]), id_auth);
  1382.   id_auth = string(ord(r[s+11]), id_auth);
  1383.   id_auth = string(ord(r[s+10]), id_auth);
  1384.   id_auth = string(ord(r[s+9]), id_auth);
  1385.   
  1386.   num_auths = ord(r[s+8]);
  1387.   sub_auths = "";
  1388.   k = 15;
  1389.   for(c = 0;c < num_auths; c = c+1)
  1390.   {
  1391.   n = ord(r[s+k+3]);
  1392.   n = ord(r[s+k+2])+n*256;
  1393.   n = ord(r[s+k+1])+n*256;
  1394.   n = ord(r[s+k])+n*256;
  1395.   k = k + 4;
  1396.   sub_auths = string(sub_auths,"-",n);
  1397.   }
  1398.   
  1399.   sid = string(ord(r[s+7]), "-", id_auth, sub_auths);
  1400.   # display("sid = ", sid, "\n");
  1401.   if(mask & WRITE){
  1402.     #     display("writeable by ", sid, "\n");
  1403.     #      display(mask & WRITE, "\n");
  1404.     
  1405.      if((sid != ADMIN_SID) &&  
  1406.         (sid != LOCAL_SYSTEM_SID) && 
  1407.         (sid != CREATOR_OWNER_SID))
  1408.      {
  1409.        #display("sid != ", CREATOR_OWNER_SID, "\n");
  1410.        #display(mask, "\n");
  1411.        return(TRUE);
  1412.      }
  1413.       }
  1414.   s = s + z;
  1415.  } 
  1416.  return(FALSE);
  1417. }
  1418.  
  1419.  
  1420. #---------------------------------------------------------------------#
  1421. # Get the security descriptor for a key                               #
  1422. #---------------------------------------------------------------------#
  1423.  
  1424.  
  1425.  
  1426. function registry_get_key_security(soc, uid, tid, pipe, reply)
  1427. {
  1428.  local_var magic, req, r, tid_low, tid_high, uid_low, uid_high, pipe_low, pipe_high;
  1429.  
  1430.  tid_low = tid % 256;
  1431.  tid_high = tid / 256;
  1432.  
  1433.  uid_low = uid % 256;
  1434.  uid_high = uid / 256;
  1435.  
  1436.  pipe_low = pipe % 256;
  1437.  pipe_high = pipe / 256;
  1438.  
  1439.  req = raw_string(0x00, 0x00,
  1440.            0x00, 0x90, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00,
  1441.           0x00, 0x00, 0x00, 0x18, 0x03, 0x80, 0x00, 0x83,
  1442.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1443.           0x00, 0x00, tid_low, tid_high, 0x00, 0x28, uid_low, uid_high,
  1444.           g_mlo, g_mhi, 0x10, 0x00, 0x00, 0x3C, 0x00, 0x00,
  1445.           0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
  1446.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54,
  1447.           0x00, 0x3C, 0x00, 0x54, 0x00, 0x02, 0x00, 0x26,
  1448.           0x00, pipe_low, pipe_high, 0x4D, 0x00, 0x00, 0x5C, 0x00,
  1449.           0x50, 0x00, 0x49, 0x00, 0x50, 0x00, 0x45, 0x00,
  1450.           0x5C, 0x00, 0x00, 0x00, 0xEE, 0xD5, 0x05, 0x00,
  1451.           0x00, 0x03, 0x10, 0x00, 0x00, 0x00, 0x3C, 0x00,
  1452.           0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x24, 0x00,
  1453.           0x00, 0x00, 0x00, 0x00, 0x0c, 0x00);
  1454.  if(strlen(reply) < 104)return(FALSE);
  1455.  
  1456.  magic = raw_string(ord(reply[84]));          
  1457.  for(i=1;i<20;i=i+1)
  1458.  {
  1459.   magic = magic + raw_string(ord(reply[84+i]));
  1460.  }
  1461.  
  1462.  req = req + magic + raw_string(0x04) + crap(data:raw_string(0), length:15);
  1463.  
  1464.  send(socket:soc, data:req);
  1465.  r = smb_recv(socket:soc, length:65535);
  1466.  
  1467.  
  1468.  len1 =  ord(r[strlen(r) - 12]);
  1469.  len2 = ord(r[strlen(r) - 11]);
  1470.  len3 = ord(r[strlen(r) - 10]);
  1471.  len4 = ord(r[strlen(r) - 9]);
  1472.  req = raw_string(0x00, 0x00,
  1473.            0x00, 0x9C, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00,
  1474.           0x00, 0x00, 0x00, 0x18, 0x03, 0x80, 0x00, 0x83,
  1475.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1476.           0x00, 0x00, tid_low, tid_high, 0x00, 0x28, uid_low, uid_high,
  1477.           g_mlo, g_mhi, 0x10, 0x00, 0x00, 0x48, 0x00, 0x00,
  1478.           0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
  1479.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54,
  1480.           0x00, 0x48, 0x00, 0x54, 0x00, 0x02, 0x00, 0x26,
  1481.           0x00, pipe_low, pipe_high, 0x59, 0x00, 0x00, 0x5C, 0x00,
  1482.           0x50, 0x00, 0x49, 0x00, 0x50, 0x00, 0x45, 0x00,
  1483.           0x5C, 0x00, 0x00, 0x00, 0xEE, 0xD5, 0x05, 0x00,
  1484.           0x00, 0x03, 0x10, 0x00, 0x00, 0x00, 0x48, 0x00,
  1485.           0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x30, 0x00,
  1486.           0x00, 0x00, 0x00, 0x00, 0x0c, 0x00);
  1487.           
  1488.   req = req + magic + raw_string(0x04, 0x00, 0x00, 0x00, 0x38, 0x8d,
  1489.        0x07, 0x00, len1, len2, len3, len4, 0x00, 0x00,
  1490.        0x00, 0x00, len1, len2, len3, len4, 0x00, 0x00,
  1491.        0x00, 0x00, 0x00, 0x00, 0x00, 0x00);          
  1492.     
  1493.     
  1494.  send(socket:soc, data:req);
  1495.  r = smb_recv(socket:soc, length:65535);
  1496.  if(strlen(r) < 150)return(NULL);
  1497.  return(r);
  1498. }
  1499.  
  1500.  
  1501. #---------------------------------------------------------------------#
  1502. # returns 'TRUE' if <key> exists                      #
  1503. #---------------------------------------------------------------------#
  1504. function registry_key_exists(key)
  1505. {
  1506.  local_var name, domain, _smb_port, login, pass, soc, r, uid, tid, pipe, ret, prot;
  1507.  local_var magic, flag, i;
  1508.  
  1509. name =  kb_smb_name();
  1510. if(!name)exit(0);
  1511.  
  1512.  
  1513. domain = kb_smb_domain();
  1514. _smb_port = kb_smb_transport();
  1515. if(!_smb_port)exit(0);
  1516.  
  1517.  
  1518. if(!get_port_state(_smb_port))return(FALSE);
  1519.  
  1520. login = kb_smb_login();
  1521. pass  = kb_smb_password();
  1522.  
  1523. if(!login)login = "";
  1524. if(!pass) pass = "";
  1525.  
  1526.       
  1527. soc = open_sock_tcp(_smb_port);
  1528. if ( ! soc ) return NULL;
  1529.  
  1530. #
  1531. # Request the session
  1532. r = smb_session_request(soc:soc,  remote:name);
  1533. if(!r)return(FALSE);
  1534.  
  1535. #
  1536. # Negociate the protocol
  1537. #
  1538. prot = smb_neg_prot(soc:soc);
  1539. if(!prot)return(FALSE);
  1540.  
  1541.  
  1542. #
  1543. # Set up our session
  1544. #
  1545. r = smb_session_setup(soc:soc, login:login, password:pass, domain:domain, prot:prot);
  1546. if(!r)return(FALSE);
  1547. # and extract our uid
  1548. uid = session_extract_uid(reply:r);
  1549.  
  1550.  
  1551. #
  1552. # Connect to the remote IPC and extract the TID
  1553. # we are attributed
  1554. #      
  1555. r = smb_tconx(soc:soc, name:name, uid:uid, share:"IPC$");
  1556. # and extract our tree id
  1557. tid = tconx_extract_tid(reply:r);
  1558. if(!tid)return(NULL);
  1559.  
  1560. #
  1561. # Create a pipe to \winreg
  1562. #
  1563. r = smbntcreatex(soc:soc, uid:uid, tid:tid, name:"\winreg");
  1564. if(!r)return(NULL);
  1565. # and extract its ID
  1566. pipe = smbntcreatex_extract_pipe(reply:r);
  1567.  
  1568. #
  1569. # Setup things
  1570. #
  1571.  
  1572.  
  1573.  
  1574. r = pipe_accessible_registry(soc:soc, uid:uid, tid:tid, pipe:pipe);
  1575. if(!r)return(FALSE);
  1576. r = registry_open_hklm(soc:soc, uid:uid, tid:tid, pipe:pipe);
  1577. r2 = registry_get_key(soc:soc, uid:uid, tid:tid, pipe:pipe, key:key, reply:r);
  1578. close(soc);
  1579. registry_close(soc:soc, uid:uid, tid:tid, pipe:pipe, reply:r2);
  1580. registry_close(soc:soc, uid:uid, tid:tid, pipe:pipe, reply:r);
  1581. if ( ! r2 && strlen(r2) < 104) return NULL;
  1582. flag = 0;
  1583. for(i=1;i<20;i=i+1)
  1584.  {
  1585.   if ( ord(r2[84+i]) != 0 ) flag = 1;
  1586.  }
  1587.  
  1588. if ( flag ) return TRUE;
  1589. else return NULL;
  1590.  
  1591. }
  1592.          
  1593. #---------------------------------------------------------------------#
  1594. # returns 'TRUE' if <key> is writeable                      #
  1595. #---------------------------------------------------------------------#
  1596.  
  1597.  
  1598. function registry_get_acl(key)
  1599. {
  1600.  local_var name, domain, _smb_port, login, pass, soc, r, uid, tid, pipe, ret, prot;
  1601.  
  1602. name =  kb_smb_name();
  1603. if(!name)exit(0);
  1604.  
  1605.  
  1606. domain = kb_smb_domain();
  1607. _smb_port = kb_smb_transport();
  1608. if(!_smb_port)exit(0);
  1609.  
  1610.  
  1611. if(!get_port_state(_smb_port))return(FALSE);
  1612.  
  1613. login = kb_smb_login();
  1614. pass  = kb_smb_password();
  1615.  
  1616. if(!login)login = "";
  1617. if(!pass) pass = "";
  1618.  
  1619.       
  1620. soc = open_sock_tcp(_smb_port);
  1621. if ( ! soc ) return NULL;
  1622.  
  1623. #
  1624. # Request the session
  1625. r = smb_session_request(soc:soc,  remote:name);
  1626. if(!r)return(FALSE);
  1627.  
  1628. #
  1629. # Negociate the protocol
  1630. #
  1631. prot = smb_neg_prot(soc:soc);
  1632. if(!prot)return(FALSE);
  1633.  
  1634.  
  1635. #
  1636. # Set up our session
  1637. #
  1638. r = smb_session_setup(soc:soc, login:login, password:pass, domain:domain, prot:prot);
  1639. if(!r)return(FALSE);
  1640. # and extract our uid
  1641. uid = session_extract_uid(reply:r);
  1642.  
  1643.  
  1644. #
  1645. # Connect to the remote IPC and extract the TID
  1646. # we are attributed
  1647. #      
  1648. r = smb_tconx(soc:soc, name:name, uid:uid, share:"IPC$");
  1649. # and extract our tree id
  1650. tid = tconx_extract_tid(reply:r);
  1651. if(!tid)return(NULL);
  1652.  
  1653. #
  1654. # Create a pipe to \winreg
  1655. #
  1656. r = smbntcreatex(soc:soc, uid:uid, tid:tid, name:"\winreg");
  1657. if(!r)return(NULL);
  1658. # and extract its ID
  1659. pipe = smbntcreatex_extract_pipe(reply:r);
  1660.  
  1661. #
  1662. # Setup things
  1663. #
  1664.  
  1665.  
  1666.  
  1667. r = pipe_accessible_registry(soc:soc, uid:uid, tid:tid, pipe:pipe);
  1668. if(!r)return(FALSE);
  1669. r = registry_open_hklm(soc:soc, uid:uid, tid:tid, pipe:pipe);
  1670. if(strlen(key))
  1671.  r2 = registry_get_key(soc:soc, uid:uid, tid:tid, pipe:pipe, key:key, reply:r);
  1672. else 
  1673.  r2 = r;
  1674.  
  1675.  
  1676. if(r2)
  1677.  {
  1678.  r3 =  registry_get_key_security(soc:soc, uid:uid, tid:tid, pipe:pipe, reply:r2);
  1679.  registry_close(soc:soc, uid:uid, tid:tid, pipe:pipe, reply:r2);
  1680.  if ( strlen(key) )  registry_close(soc:soc, uid:uid, tid:tid, pipe:pipe, reply:r);
  1681.  close(soc);
  1682.  
  1683.  if(strlen(r3) < 100)return(NULL);
  1684.  return(r3);
  1685.  }
  1686. return(NULL);
  1687. }
  1688.  
  1689. #---------------------------------------------------------------------#
  1690. # Get an item of type reg_sz from the key                             #
  1691. #---------------------------------------------------------------------#
  1692.  
  1693. function unicode2(data)
  1694. {
  1695.  len = strlen(data);
  1696.  ret = raw_string(0, ord(data[0]));
  1697.  
  1698.  for(i=1;i<len;i=i+1)
  1699.  {
  1700.   ret = ret + raw_string(0, ord(data[i]));
  1701.  }
  1702.  if(len & 1)ret = ret + raw_string(0x00, 0x00); 
  1703.  else ret = ret + raw_string(0x00, 0x00, 0x00, 0x63);
  1704.  return(ret);
  1705. }
  1706.  
  1707. function unicode3(data)
  1708. {
  1709.  len = strlen(data);
  1710.  ret = raw_string(0, ord(data[0]));
  1711.  
  1712.  for(i=1;i<len;i=i+1)
  1713.  {
  1714.   ret = ret + raw_string(0, ord(data[i]));
  1715.  }
  1716.  if(len & 1)ret = ret + raw_string(0x00, 0x00); 
  1717.  else ret = ret + raw_string(0x00, 0x00, 0x00, 0x00);
  1718.  return(ret);
  1719. }
  1720. function unicode4(data)
  1721. {
  1722.  len = strlen(data);
  1723.  ret = raw_string(0, ord(data[0]));
  1724.  
  1725.  for(i=1;i<len;i=i+1)
  1726.  {
  1727.   ret = ret + raw_string(ord(data[i]),0);
  1728.  }
  1729.  if(len & 1)ret = ret + raw_string(0x00); 
  1730.  return(ret);
  1731. }
  1732.  
  1733. function registry_get_item_sz(soc, uid, tid, pipe, item, reply)
  1734. {
  1735.  local_var i;
  1736.  item_len = strlen(item) + 1;
  1737.  item_len_lo = item_len % 256;
  1738.  item_len_hi = item_len / 256;
  1739.  
  1740.  uc2 = unicode2(data:item);
  1741.  len = 188 + strlen(uc2);
  1742.  len_lo = len % 256;
  1743.  len_hi = len / 256;
  1744.  
  1745.  tid_low = tid % 256;
  1746.  tid_high = tid / 256;
  1747.  uid_low = uid % 256;
  1748.  uid_high = uid / 256;
  1749.  pipe_low = pipe % 256;
  1750.  pipe_high = pipe / 256;
  1751.  
  1752.  bcc = 121 + strlen(uc2);
  1753.  bcc_lo = bcc % 256;
  1754.  bcc_hi = bcc / 256;
  1755.  
  1756.  y = 80 + strlen(uc2);
  1757.  y_lo = y % 256;
  1758.  y_hi = y / 256;
  1759.  
  1760.  z = 104 + strlen(uc2);
  1761.  z_lo = z % 256;
  1762.  z_hi = z / 256;
  1763.  req = raw_string(0x00, 0x00,
  1764.            len_hi, len_lo, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00,
  1765.           0x00, 0x00, 0x00, 0x18, 0x03, 0x80, 0x1D, 0x83,
  1766.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1767.           0x00, 0x00, tid_low, tid_high, 0x00, 0x28, uid_low, uid_high,
  1768.           g_mlo, g_mhi, 0x10, 0x00, 0x00, z_lo, z_hi, 0x00,
  1769.           0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
  1770.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54,
  1771.           0x00, z_lo, z_hi, 0x54, 0x00, 0x02, 0x00, 0x26,
  1772.           0x00, pipe_low, pipe_high, bcc_lo, bcc_hi, 0x00, 0x5C, 0x00,
  1773.           0x50, 0x00, 0x49, 0x00, 0x50, 0x00, 0x45, 0x00,
  1774.           0x5C, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x05, 0x00,
  1775.           0x00, 0x03, 0x10, 0x00, 0x00, 0x00, z_lo, z_hi,
  1776.           0x00, 0x00, 0x03, 0x00, 0x00, 0x00, y_lo, y_hi,
  1777.           0x00, 0x00, 0x00, 0x00, 0x11, 0x00);
  1778.           
  1779.  if(strlen(reply) < 104)return(FALSE);
  1780.  magic = raw_string(ord(reply[84]));
  1781.  for(i=1;i<20;i=i+1)
  1782.  {
  1783.   magic = magic + raw_string(ord(reply[84+i]));
  1784.  }
  1785.  
  1786.  x = 2 + strlen(item) + strlen(item);
  1787.  x_lo = x % 256;
  1788.  x_hi = x / 256;
  1789.   
  1790.  y = y + 3;
  1791.  y_lo = y % 256;
  1792.  y_hi = y / 256;
  1793.  
  1794.   req = req + magic + raw_string(x_lo, x_hi, 0x0A, 0x02, 0x00, 0xEC,
  1795.           0xFD, 0x7F, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00,
  1796.         0x00, 0x00, item_len_lo, item_len_hi, 0x00)
  1797.         
  1798.         + uc2    + 
  1799.         raw_string(0x00, 0x34, 0xFF,
  1800.         0x12, 0x00, 0xEF, 0x10, 0x40, 0x00, 0x18, 0x1E,
  1801.         0x7c, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
  1802.         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFF,
  1803.         0x12, 0x00, 0x00, 0x04, 0x00, 0x00, 0x30, 0xFF,
  1804.         0x12, 0x00, 0x00, 0x00, 0x00, 0x00);
  1805.         
  1806.  send(socket:soc, data:req);
  1807.  req = smb_recv(socket:soc, length:4000);        
  1808.  return(req);
  1809. }          
  1810.  
  1811. #------------------------------------------------------#
  1812. # Decode the reply from the registry                   #
  1813. #------------------------------------------------------#
  1814.  
  1815. function registry_decode_binary(data)
  1816. {
  1817.  local_var i, o, len, index;
  1818.  
  1819.  len = ord(data[2])*256;
  1820.  len = len + ord(data[3]);
  1821.  if(len < 130)return(NULL);
  1822.  
  1823.  data_offset = ord(data[52])*256;
  1824.  data_offset = data_offset + ord(data[51]) + 4;
  1825.  data_len = ord(data[data_offset+43]);
  1826.  data_len = data_len * 256;
  1827.  data_len = data_len + ord(data[data_offset+44]);
  1828.  index = data_offset + 48;
  1829.  o = "";
  1830.  data_len = data_len - 2;
  1831.  for(i=0;i<data_len;i=i+1)
  1832.  {
  1833.    o = string(o, raw_string(ord(data[index+i])));
  1834.  }
  1835.  return(o);
  1836. }
  1837.  
  1838.  
  1839.  
  1840. function registry_decode_sz(data)
  1841. {
  1842.  local_var i, o, len, index;
  1843.  
  1844.  len = ord(data[2])*256;
  1845.  len = len + ord(data[3]);
  1846.  if(len < 128)return(NULL);
  1847.  
  1848.  data_offset = ord(data[52])*256;
  1849.  data_offset = data_offset + ord(data[51]) + 4;
  1850.  data_len = ord(data[data_offset+47]);
  1851.  data_len = data_len * 256 + ord(data[data_offset+46]);
  1852.  data_len = data_len * 256 + ord(data[data_offset+45]);
  1853.  data_len = data_len * 256 + ord(data[data_offset+44]);
  1854.  index = data_offset + 48;
  1855.  o = "";
  1856.  data_len = data_len - 2;
  1857.  
  1858.  for(i=0;i<data_len;i=i+2)
  1859.  {
  1860.    o = string(o, raw_string(ord(data[index+i])));
  1861.  }
  1862.  return(o);
  1863. }
  1864.  
  1865. #---------------------------------------------------------------------#
  1866. #---------------------------------------------------------------------#
  1867. # Get an item of type reg_dword from the key                          #
  1868. #---------------------------------------------------------------------#
  1869.  
  1870. function registry_get_item_dword(soc, uid, tid, pipe, item, reply)
  1871. {
  1872.  local_var item_len, item_len_lo, item_len_hi, uc2, len, len_lo, len_hi, tid_low, tid_high, uid_low, uid_high;
  1873.  local_var pipe_low, pipe_high, bcc, bcc_lo, bcc_hi, y, y_lo, y_hi, z, z_lo, z_hi, req;
  1874.  local_var magic, x, x_lo, x_hi;
  1875.  item_len = strlen(item) + 1;
  1876.  item_len_lo = item_len % 256;
  1877.  item_len_hi = item_len / 256;
  1878.  
  1879.  uc2 = unicode2(data:item);
  1880.  len = 188 + strlen(uc2);
  1881.  len_lo = len % 256;
  1882.  len_hi = len / 256;
  1883.  
  1884.  tid_low = tid % 256;
  1885.  tid_high = tid / 256;
  1886.  uid_low = uid % 256;
  1887.  uid_high = uid / 256;
  1888.  pipe_low = pipe % 256;
  1889.  pipe_high = pipe / 256;
  1890.  
  1891.  bcc = 121 + strlen(uc2);
  1892.  bcc_lo = bcc % 256;
  1893.  bcc_hi = bcc / 256;
  1894.  
  1895.  y = 80 + strlen(uc2);
  1896.  y_lo = y % 256;
  1897.  y_hi = y / 256;
  1898.  
  1899.  z = 104 + strlen(uc2);
  1900.  z_lo = z % 256;
  1901.  z_hi = z / 256;
  1902.  req = raw_string(0x00, 0x00,
  1903.            len_hi, len_lo, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00,
  1904.           0x00, 0x00, 0x00, 0x18, 0x03, 0x80, 0x1D, 0x83,
  1905.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1906.           0x00, 0x00, tid_low, tid_high, 0x00, 0x28, uid_low, uid_high,
  1907.           g_mlo, g_mhi, 0x10, 0x00, 0x00, z_lo, z_hi, 0x00,
  1908.           0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
  1909.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54,
  1910.           0x00, z_lo, z_hi, 0x54, 0x00, 0x02, 0x00, 0x26,
  1911.           0x00, pipe_low, pipe_high, bcc_lo, bcc_hi, 0x00, 0x5C, 0x00,
  1912.           0x50, 0x00, 0x49, 0x00, 0x50, 0x00, 0x45, 0x00,
  1913.           0x5C, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x05, 0x00,
  1914.           0x00, 0x03, 0x10, 0x00, 0x00, 0x00, z_lo, z_hi,
  1915.           0x00, 0x00, 0x03, 0x00, 0x00, 0x00, y_lo, y_hi,
  1916.           0x00, 0x00, 0x00, 0x00, 0x11, 0x00);
  1917.           
  1918.  magic = raw_string(ord(reply[84]));
  1919.  for(i=1;i<20;i=i+1)
  1920.  {
  1921.    magic = magic + raw_string(ord(reply[84+i]));
  1922.  }
  1923.  
  1924.  
  1925.  x = 2 + strlen(item) + strlen(item);
  1926.  x_lo = x % 256;
  1927.  x_hi = x / 256;
  1928.   
  1929.  y = y + 3;
  1930.  y_lo = y % 256;
  1931.  y_hi = y / 256;
  1932.  
  1933.   req = req + magic + raw_string(x_lo, x_hi, 0x0A, 0x02, 0x00, 0xEC,
  1934.           0xFD, 0x7F, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00,
  1935.         0x00, 0x00, item_len_lo, item_len_hi, 0x00)
  1936.         
  1937.         + uc2    + 
  1938.         raw_string(0x00, 0x34, 0xFF,
  1939.         0x12, 0x00, 0xEF, 0x10, 0x40, 0x00, 0x18, 0x1E,
  1940.         0x7c, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
  1941.         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFF,
  1942.         0x12, 0x00, 0x00, 0x04, 0x00, 0x00, 0x30, 0xFF,
  1943.         0x12, 0x00, 0x00, 0x00, 0x00, 0x00);
  1944.         
  1945.  send(socket:soc, data:req);
  1946.  req = smb_recv(socket:soc, length:4000);        
  1947.  return(req);
  1948. }          
  1949.  
  1950. #------------------------------------------------------#
  1951. # Decode the reply from the registry                   #
  1952. #------------------------------------------------------#
  1953.  
  1954. function registry_decode_dword(data)
  1955. {
  1956.  len = ord(data[2])*256;
  1957.  len = len + ord(data[3]);
  1958.  if(len < 126)return(NULL);
  1959.  
  1960.  data_offset = ord(data[52])*256;
  1961.  data_offset = data_offset + ord(data[51]) + 4;
  1962.  data_len = ord(data[data_offset+43]);
  1963.  data_len = data_len * 256;
  1964.  data_len = data_len + ord(data[data_offset+44]);
  1965.  index = data_offset + 48;
  1966.  o = "";
  1967.  for(i=data_len;i>0;i=i-1)
  1968.  {
  1969.    t *= 256;
  1970.    t += ord(data[index+i-1]);
  1971.  }
  1972.  
  1973.  return(t);
  1974. }
  1975.               
  1976.          
  1977. #---------------------------------------------------------------------#
  1978. # registry_get_dword()                              #
  1979. #---------------------------------------------------------------------#
  1980.  
  1981.  
  1982. function registry_get_dword(key, item)
  1983. {
  1984.  local_var name, port, login, pass, soc, dom, r, prot, value;
  1985.  
  1986.  if ( get_kb_item("SMB/samba") ) exit(0);
  1987.  
  1988.  port = kb_smb_transport();
  1989.  if(!port)exit(0);
  1990.  
  1991.  name = kb_smb_name();
  1992.  if(!name)exit(0);
  1993.  
  1994.  
  1995.  if(!get_port_state(port))return(FALSE);
  1996.  
  1997.  login = kb_smb_login();
  1998.  pass  = kb_smb_password();
  1999.  
  2000. if(!login)login = "";
  2001. if(!pass) pass = "";
  2002.  
  2003.  dom = kb_smb_domain();
  2004.       
  2005.  soc = open_sock_tcp(port);
  2006.  if(!soc)exit(0);
  2007.  
  2008.  #
  2009.  # Request the session
  2010.  # 
  2011.  r = smb_session_request(soc:soc,  remote:name);
  2012.  if(!r){ close(soc); return NULL;}
  2013.  
  2014.  #
  2015.  # Negociate the protocol
  2016.  #
  2017.  prot = smb_neg_prot(soc:soc);
  2018.  if(!prot) { close(soc); return NULL;}
  2019.  
  2020.  
  2021.  #
  2022.  # Set up our session
  2023.  #
  2024.  r = smb_session_setup(soc:soc, login:login, password:pass, domain:dom, prot:prot);
  2025.  if(!r){ close(soc); return NULL;}
  2026.  # and extract our uid
  2027.  uid = session_extract_uid(reply:r);
  2028.  
  2029.  #
  2030.  # Connect to the remote IPC and extract the TID
  2031.  # we are attributed
  2032.  #      
  2033.  r = smb_tconx(soc:soc, name:name, uid:uid, share:"IPC$");
  2034.  # and extract our tree id
  2035.  tid = tconx_extract_tid(reply:r);
  2036.  
  2037.  
  2038.  #
  2039.  # Create a pipe to \winreg
  2040.  #
  2041.  r = smbntcreatex(soc:soc, uid:uid, tid:tid, name:"\winreg");
  2042.  if(!r){ close(soc); return(NULL); }
  2043.  # and extract its ID
  2044.  pipe = smbntcreatex_extract_pipe(reply:r);
  2045.  
  2046.  #
  2047.  # Setup things
  2048.  #
  2049.  r = pipe_accessible_registry(soc:soc, uid:uid, tid:tid, pipe:pipe);
  2050.  if(!r){ close(soc); return(NULL); }
  2051.  r = registry_open_hklm(soc:soc, uid:uid, tid:tid, pipe:pipe);
  2052.  
  2053.  r2 = registry_get_key(soc:soc, uid:uid, tid:tid, pipe:pipe, key:key, reply:r);
  2054.  if(r2)
  2055.  {
  2056.  r3 =  registry_get_item_dword(soc:soc, uid:uid, tid:tid, pipe:pipe, item:item, reply:r2);
  2057.  registry_close(soc:soc, uid:uid, tid:tid, pipe:pipe, reply:r2);
  2058.  registry_close(soc:soc, uid:uid, tid:tid, pipe:pipe, reply:r);
  2059.  value = registry_decode_dword(data:r3);
  2060.  close(soc);
  2061.  return(value); 
  2062.  }
  2063.  close(soc);
  2064.  return NULL;
  2065. }
  2066.               
  2067. #---------------------------------------------------------------------#
  2068. # registry_get_binary()                              #
  2069. #---------------------------------------------------------------------#
  2070. function registry_get_binary(key, item)
  2071. {
  2072.  local_var name, _smb_port, login, pass, domain, soc, uid, tid, r, prot, pipe;
  2073.  
  2074. if ( get_kb_item("SMB/samba") ) exit(0);
  2075.  
  2076. name = kb_smb_name();
  2077. if(!name)exit(0);
  2078.  
  2079. _smb_port = kb_smb_transport();
  2080. if(!_smb_port)exit(0);
  2081.  
  2082. if(!get_port_state(_smb_port))return(FALSE);
  2083.  
  2084. login = kb_smb_login();
  2085. pass  = kb_smb_password();
  2086.  
  2087. domain = kb_smb_domain();
  2088.  
  2089. if(!login)login = "";
  2090. if(!pass) pass = "";
  2091.  
  2092.       
  2093. soc = open_sock_tcp(_smb_port);
  2094. if(!soc)return(FALSE);
  2095.  
  2096. #
  2097. # Request the session
  2098. r = smb_session_request(soc:soc,  remote:name);
  2099. if(!r) { close(soc); return(FALSE); }
  2100.  
  2101. #
  2102. # Negociate the protocol
  2103. #
  2104. prot = smb_neg_prot(soc:soc);
  2105. if(!prot){ close(soc); return(FALSE); }
  2106.  
  2107.  
  2108. #
  2109. # Set up our session
  2110. #
  2111. r = smb_session_setup(soc:soc, login:login, password:pass, domain:domain, prot:prot);
  2112. if(!r){ close(soc); return(FALSE); }
  2113. # and extract our uid
  2114. uid = session_extract_uid(reply:r);
  2115.  
  2116. #
  2117. # Connect to the remote IPC and extract the TID
  2118. # we are attributed
  2119. #      
  2120. r = smb_tconx(soc:soc, name:name, uid:uid, share:"IPC$");
  2121. # and extract our tree id
  2122. tid = tconx_extract_tid(reply:r);
  2123. if(!tid){ close(soc); return(FALSE); }
  2124.  
  2125. #
  2126. # Create a pipe to \winreg
  2127. #
  2128. r = smbntcreatex(soc:soc, uid:uid, tid:tid, name:"\winreg");
  2129. if(!r){ close(soc); return(FALSE);}
  2130. # and extract its ID
  2131. pipe = smbntcreatex_extract_pipe(reply:r);
  2132.  
  2133. #
  2134. # Setup things
  2135. #
  2136. r = pipe_accessible_registry(soc:soc, uid:uid, tid:tid, pipe:pipe);
  2137. if(!r){ close(soc); return(FALSE); }
  2138. r = registry_open_hklm(soc:soc, uid:uid, tid:tid, pipe:pipe);
  2139.  
  2140. r2 = registry_get_key(soc:soc, uid:uid, tid:tid, pipe:pipe, key:key, reply:r);
  2141. if(r2)
  2142. {
  2143.  r3 =  registry_get_item_sz(soc:soc, uid:uid, tid:tid, pipe:pipe, item:item, reply:r2);
  2144.  registry_close(soc:soc, uid:uid, tid:tid, pipe:pipe, reply:r2);
  2145.  registry_close(soc:soc, uid:uid, tid:tid, pipe:pipe, reply:r);
  2146.  value = registry_decode_binary(data:r3);
  2147.  close(soc);
  2148.  return(value);
  2149. }
  2150. close(soc);
  2151. return(FALSE);
  2152. }
  2153.          
  2154. #---------------------------------------------------------------------#
  2155. # registry_get_sz()                              #
  2156. #---------------------------------------------------------------------#
  2157.  
  2158.  
  2159. function registry_get_sz(key, item)
  2160. {
  2161.  local_var name, _smb_port, login, pass, domain, soc, uid, tid, r, prot, pipe;
  2162.  
  2163. if ( get_kb_item("SMB/samba") ) exit(0);
  2164.  
  2165. name = kb_smb_name();
  2166. if(!name)exit(0);
  2167.  
  2168. _smb_port = kb_smb_transport();
  2169. if(!_smb_port)exit(0);
  2170.  
  2171. if(!get_port_state(_smb_port))return(FALSE);
  2172.  
  2173. login = kb_smb_login();
  2174. pass  = kb_smb_password();
  2175.  
  2176. domain = kb_smb_domain();
  2177.  
  2178. if(!login)login = "";
  2179. if(!pass) pass = "";
  2180.  
  2181.       
  2182. soc = open_sock_tcp(_smb_port);
  2183. if(!soc)return(FALSE);
  2184.  
  2185. #
  2186. # Request the session
  2187. r = smb_session_request(soc:soc,  remote:name);
  2188. if(!r) { close(soc); return(FALSE); }
  2189.  
  2190. #
  2191. # Negociate the protocol
  2192. #
  2193. prot = smb_neg_prot(soc:soc);
  2194. if(!prot){ close(soc); return(FALSE); }
  2195.  
  2196.  
  2197. #
  2198. # Set up our session
  2199. #
  2200. r = smb_session_setup(soc:soc, login:login, password:pass, domain:domain, prot:prot);
  2201. if(!r){ close(soc); return(FALSE); }
  2202. # and extract our uid
  2203. uid = session_extract_uid(reply:r);
  2204.  
  2205. #
  2206. # Connect to the remote IPC and extract the TID
  2207. # we are attributed
  2208. #      
  2209. r = smb_tconx(soc:soc, name:name, uid:uid, share:"IPC$");
  2210. # and extract our tree id
  2211. tid = tconx_extract_tid(reply:r);
  2212. if(!tid){ close(soc); return(FALSE); }
  2213.  
  2214. #
  2215. # Create a pipe to \winreg
  2216. #
  2217. r = smbntcreatex(soc:soc, uid:uid, tid:tid, name:"\winreg");
  2218. if(!r){ close(soc); return(FALSE);}
  2219. # and extract its ID
  2220. pipe = smbntcreatex_extract_pipe(reply:r);
  2221.  
  2222. #
  2223. # Setup things
  2224. #
  2225. r = pipe_accessible_registry(soc:soc, uid:uid, tid:tid, pipe:pipe);
  2226. if(!r){ close(soc); return(FALSE); }
  2227. r = registry_open_hklm(soc:soc, uid:uid, tid:tid, pipe:pipe);
  2228.  
  2229. r2 = registry_get_key(soc:soc, uid:uid, tid:tid, pipe:pipe, key:key, reply:r);
  2230. if(r2)
  2231. {
  2232.  r3 =  registry_get_item_sz(soc:soc, uid:uid, tid:tid, pipe:pipe, item:item, reply:r2);
  2233.  registry_close(soc:soc, uid:uid, tid:tid, pipe:pipe, reply:r2);
  2234.  registry_close(soc:soc, uid:uid, tid:tid, pipe:pipe, reply:r);
  2235.  value = registry_decode_sz(data:r3);
  2236.  close(soc);
  2237.  return(value);
  2238. }
  2239. close(soc);
  2240. return(FALSE);
  2241. }
  2242.  
  2243. #---------------------------------------------------------------------------#
  2244. # SAM related functions                                #
  2245. #---------------------------------------------------------------------------#
  2246.  
  2247. #------------------------------------------------------#
  2248. # Open a pipe to \samr                                 #
  2249. #------------------------------------------------------#
  2250. function OpenPipeToSamr(soc, uid, tid)
  2251. {
  2252.  tid_hi = tid / 256;
  2253.  tid_lo = tid % 256;
  2254.  
  2255.  uid_hi = uid / 256;
  2256.  uid_lo = uid % 256;
  2257.  
  2258.  
  2259.  req = raw_string(0x00, 0x00,
  2260.            0x00, 0x60, 0xFF, 0x53, 0x4D, 0x42, 0xA2, 0x00,
  2261.           0x00, 0x00, 0x00, 0x18, 0x07, 0xC8, 0x00, 0x00,
  2262.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  2263.           0x00, 0x00, tid_lo, tid_hi, 0x00, 0x28, uid_lo, uid_hi,
  2264.           g_mlo, g_mhi, 0x18, 0xFF, 0x00, 0xDE, 0xDE, 0x00,
  2265.           0x0A, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 
  2266.           0x00, 0x00, 0x9F, 0x01, 0x02, 0x00, 0x00, 0x00,
  2267.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  2268.           0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00,
  2269.           0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x02, 0x00,
  2270.           0x00, 0x00, 0x03, 0x0D, 0x00, 0x00, 0x5C, 0x00,
  2271.           0x73, 0x00, 0x61, 0x00, 0x6D, 0x00, 0x72, 0x00,
  2272.           0x00, 0x00);
  2273.           
  2274.           
  2275.  send(socket:soc, data:req);
  2276.  r = smb_recv(socket:soc, length:4096);
  2277.  if(strlen(r) < 42) return(FALSE);
  2278.  else {
  2279.      low = ord(r[42]);
  2280.     hi  = ord(r[43]);
  2281.     ret = hi * 256;
  2282.     ret = ret + low;
  2283.     return(ret);
  2284.       }
  2285. }
  2286.  
  2287. function samr_smbwritex(soc, tid, uid, pipe)
  2288. {
  2289.  tid_hi = tid / 256;
  2290.  tid_lo = tid % 256;
  2291.  
  2292.  uid_hi = uid / 256;
  2293.  uid_lo = uid % 256;
  2294.  
  2295.  pipe_hi = pipe / 256;
  2296.  pipe_lo = pipe % 256;
  2297.  
  2298.  req = raw_string(0x00, 0x00,
  2299.            0x00, 0x88, 0xFF, 0x53, 0x4D, 0x42, 0x2F, 0x00,
  2300.           0x00, 0x00, 0x00, 0x18, 0x07, 0xC8, 0x00, 0x00,
  2301.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  2302.           0x00, 0x00, tid_lo, tid_hi, 0x00, 0x28, uid_lo, uid_hi,
  2303.           g_mlo, g_mhi, 0x0E, 0xFF, 0x00, 0xDE, 0xDE, pipe_lo,
  2304.           pipe_hi, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF,
  2305.           0xFF, 0x08, 0x00, 0x48, 0x00, 0x00, 0x00, 0x48,
  2306.           0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49,
  2307.           0x00, 0xEE, 0x05, 0x00, 0x0B, 0x03, 0x10, 0x00,
  2308.           0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0x00,
  2309.           0x00, 0x00, 0xB8, 0x10, 0xB8, 0x10, 0x00, 0x00,
  2310.           0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
  2311.           0x01, 0x00, 0x78, 0x57, 0x34, 0x12, 0x34, 0x12,
  2312.           0xCD, 0xAB, 0xEF, 0x00, 0x01, 0x23, 0x45, 0x67,
  2313.           0x89, 0xAC, 0x01, 0x00, 0x00, 0x00, 0x04, 0x5D,
  2314.           0x88, 0x8A, 0xEB, 0x1C, 0xC9, 0x11, 0x9F, 0xE8,
  2315.           0x08, 0x00, 0x2B, 0x10, 0x48, 0x60, 0x02, 0x00,
  2316.           0x00, 0x00);
  2317.           
  2318.  send(socket:soc, data:req);
  2319.  r = smb_recv(socket:soc, length:4096);
  2320. }        
  2321.  
  2322.  
  2323. function samr_smbreadx(soc, tid, uid, pipe)
  2324. {
  2325.  tid_hi = tid / 256;
  2326.  tid_lo = tid % 256;
  2327.  uid_hi = uid / 256;
  2328.  uid_lo = uid % 256;
  2329.  pipe_hi = pipe / 256;
  2330.  pipe_lo = pipe % 256;
  2331.  req = raw_string(0x00, 0x00,
  2332.            0x00, 0x3B, 0xFF, 0x53, 0x4D, 0x42, 0x2E, 0x00,
  2333.           0x00, 0x00, 0x00, 0x18, 0x07, 0xC8, 0x00, 0x00,
  2334.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  2335.           0x00, 0x00, tid_lo, tid_hi, 0x00, 0x28, uid_lo, uid_hi,
  2336.           g_mlo, g_mhi, 0x0C, 0xFF, 0x00, 0xDE, 0xDE, pipe_lo,
  2337.            pipe_hi, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00,
  2338.           0x04, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x04, 0x00, 
  2339.           0x00, 0x00, 0x00, 0x00, 0x00);
  2340.           
  2341.  send(socket:soc, data:req);
  2342.  r = smb_recv(socket:soc, length:4096);
  2343.  
  2344. }            
  2345.  
  2346. #------------------------------------------------------#
  2347. # Returns the unicode representation of <name>         #
  2348. #------------------------------------------------------#
  2349. function samr_uc(name)
  2350. {
  2351.  ret = "";
  2352.  for(i=0;i<strlen(name);i=i+1)
  2353.  {
  2354.   ret = ret + raw_string(0) + name[i];
  2355.  }
  2356.  return(ret);
  2357. }
  2358.  
  2359.  
  2360.  
  2361. #------------------------------------------------------#
  2362. # Connects to the remote SAM                           #
  2363. #------------------------------------------------------#
  2364. function SamrConnect2(soc, tid, uid, pipe, name)
  2365. {
  2366.  samr_smbwritex(soc:soc, tid:tid, uid:uid, pipe:pipe);
  2367.  samr_smbreadx(soc:soc, tid:tid, uid:uid, pipe:pipe);
  2368.  
  2369.  l = strlen(name);
  2370.  odd = l % 2;
  2371.  
  2372.  if(odd)p = 0;
  2373.  else p = 2;
  2374.  
  2375.  tid_hi = tid / 256;
  2376.  tid_lo = tid % 256;
  2377.  uid_hi = uid / 256;
  2378.  uid_lo = uid % 256;
  2379.  
  2380.  pipe_hi = pipe / 256;
  2381.  pipe_lo = pipe % 256;
  2382.  
  2383.  
  2384.  l = 3 + strlen(name);
  2385.  l_h = l / 256;
  2386.  l_l = l % 256;
  2387.  
  2388.  
  2389.  tot_len = 134 + strlen(name) + strlen(name) + p;
  2390.  tot_len_h = tot_len / 256;
  2391.  tot_len_l = tot_len % 256;
  2392.  
  2393.  bcc = 67 + strlen(name) + strlen(name) + p;
  2394.  bcc_lo = bcc % 256;
  2395.  bcc_hi = bcc / 256;
  2396.  
  2397.  total_data_count = 50 + strlen(name) + strlen(name) + p;
  2398.  total_data_count_lo = total_data_count % 256;
  2399.  total_data_count_hi = total_data_count / 256;
  2400.  
  2401.  req = raw_string(0x00, 0x00,
  2402.            tot_len_h, tot_len_l, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00,
  2403.           0x00, 0x00, 0x00, 0x18, 0x07, 0xC8, 0x00, 0x00,
  2404.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  2405.           0x00, 0x00, tid_lo, tid_hi, 0x00, 0x28, uid_lo, uid_hi,
  2406.           g_mlo, g_mhi, 0x10, 0x00, 0x00,total_data_count_lo, total_data_count_hi, 0x00,
  2407.           0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
  2408.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54,
  2409.           0x00, total_data_count_lo, total_data_count_hi, 0x54, 0x00, 0x02, 0x00, 0x26,
  2410.           0x00, pipe_lo, pipe_hi, bcc_lo, bcc_hi, 0x00, 0x5C, 0x00,
  2411.           0x50, 0x00, 0x49, 0x00, 0x50, 0x00, 0x45, 0x00,
  2412.           0x5C, 0x00, 0x00, 0x00, 0xAF, 0x47, 0x05, 0x00,
  2413.           0x00, 0x03, 0x10, 0x00, 0x00, 0x00, total_data_count_lo, total_data_count_hi,
  2414.           0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x28, 0x00,
  2415.           0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x60, 0x60,
  2416.           0x13, 0x00, l_l, l_h, 0x00, 0x00, 0x00, 0x00,
  2417.           0x00, 0x00, l_l, l_h, 0x00, 0x00, 0x5C, 0x00,
  2418.           0x5C) + samr_uc(name:name) + raw_string(0x00, 0x00, 0x00);
  2419.           
  2420.   if(p)req = req + raw_string(0xC9, 0x11); # 0x02, 0x00, 0x00, 0x00);
  2421.   
  2422.   req = req +  raw_string(0x30, 0x00, 0x00, 0x00);
  2423.  #display(strlen(req), "\n");          
  2424.  send(socket:soc, data:req);
  2425.  r = smb_recv(socket:soc, length:4096);          
  2426.  #display("--->", strlen(r), "\n");
  2427.  #
  2428.  # We return a handle to the remote SAM
  2429.  #          
  2430.  
  2431.  samrhdl = "";
  2432.  _len = strlen(r);
  2433.  if(_len < 24)
  2434.      return(FALSE);
  2435.     
  2436.  _len = _len - 24;
  2437.  for(i=0;i<20;i=i+1)
  2438.  {
  2439.   samrhdl = samrhdl + raw_string(ord(r[i+_len]));
  2440.   #display(hex(ord(r[i+_len])), " ");
  2441.  }
  2442.  #display("\n");
  2443.  #display("samhdl : ", strlen(samrhdl), "\n");
  2444.  return(samrhdl);
  2445. }
  2446.  
  2447.  
  2448. #--------------------------------------------------------------#
  2449. # This function is probably SamrEnumerateDomainsInSamServer()  #
  2450. # but I'm not sure of that, so I changed its name to           #
  2451. # _SamrEnumDomains()                                           #
  2452. #                                                              #
  2453. # This function only returns the first domain it obtains       #
  2454. #--------------------------------------------------------------#
  2455. function _SamrEnumDomains(soc, uid, tid, pipe, samrhdl)
  2456. {
  2457.  tid_hi = tid / 256;
  2458.  tid_lo = tid % 256;
  2459.  uid_hi = uid / 256;
  2460.  uid_lo = uid % 256;
  2461.  
  2462.  pipe_hi = pipe / 256;
  2463.  pipe_lo = pipe % 256;
  2464.  
  2465.  req = raw_string(0x00, 0x00,
  2466.            0x00, 0x88, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00,
  2467.           0x00, 0x00, 0x00, 0x18, 0x07, 0xC8, 0x00, 0x00,
  2468.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  2469.           0x00, 0x00, tid_lo, tid_hi, 0x00, 0x28, uid_lo, uid_hi,
  2470.           g_mlo, g_mhi, 0x10, 0x00, 0x00, 0x34, 0x00, 0x00,
  2471.           0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
  2472.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54,
  2473.           0x00, 0x34, 0x00, 0x54, 0x00, 0x02, 0x00, 0x26,
  2474.           0x00, pipe_lo, pipe_hi, 0x45, 0x00, 0x00, 0x5C, 0x00,
  2475.           0x50, 0x00, 0x49, 0x00, 0x50, 0x00, 0x45, 0x00,
  2476.           0x5C, 0x00, 0x00, 0x00, 0xAF, 0x47, 0x05, 0x00,
  2477.           0x00, 0x03, 0x10, 0x00, 0x00, 0x00, 0x34, 0x00,
  2478.           0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x00,
  2479.           0x00, 0x00, 0x00, 0x00, 0x06, 0x00) + samrhdl +
  2480.     raw_string(0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
  2481.           0x00, 0x00);
  2482.           
  2483.  send(socket:soc, data:req);
  2484.  r = smb_recv(socket:soc, length:4096);          
  2485.  if(strlen(r) < 137)return(FALSE);
  2486.  
  2487.  len_lo = ord(r[136]);
  2488.  len_hi = ord(r[137]);
  2489.  
  2490.  len = len_hi * 256;
  2491.  len = len + len_lo;
  2492.  dom = "";
  2493.  len = len*2;
  2494.  maxlen = strlen(r);
  2495.  if(maxlen < len)return(FALSE);
  2496.  for(i=0;i<len;i=i+2)
  2497.  {
  2498.   if(maxlen < 139+i)return(FALSE);
  2499.   dom = dom + raw_string(ord(r[139+i]), ord(r[140+i]));
  2500.  }
  2501.  #display(dom, "\n");
  2502.  return(dom);  
  2503. }
  2504.  
  2505.  
  2506. #------------------------------------------------------#
  2507. # Returns the sid from the domain <dom>                #
  2508. #------------------------------------------------------#
  2509.  
  2510. function SamrDom2Sid(soc, tid, uid, pipe, samrhdl, dom)
  2511. {
  2512.  tid_hi = tid / 256;
  2513.  tid_lo = tid % 256;
  2514.  uid_hi = uid / 256;
  2515.  uid_lo = uid % 256;
  2516.  
  2517.  pipe_hi = pipe / 256;
  2518.  pipe_lo = pipe % 256;
  2519.  
  2520.  #display(strlen(dom), "<-dom\n");
  2521.  tot_len = 148 + strlen(dom);
  2522.  tot_len_hi = tot_len / 256;
  2523.  tot_len_lo = tot_len % 256;
  2524.  
  2525.  bcc = 81 + strlen(dom);
  2526.  bcc_lo = bcc % 256;
  2527.  bcc_hi = bcc / 256;
  2528.  
  2529.  tot_dat_count = 64 + strlen(dom);
  2530.  tot_dat_count_lo = tot_dat_count % 256;
  2531.  tot_dat_count_hi = tot_dat_count / 256;
  2532.  
  2533.  dom_len = strlen(dom);
  2534.  dom_len = dom_len / 2;
  2535.  dom_len_lo = dom_len % 256;
  2536.  dom_len_hi = dom_len / 256;
  2537.   
  2538.  dom_t_len =  dom_len + 1;
  2539.  dom_t_len_lo = dom_t_len % 256;
  2540.  dom_t_len_hi = dom_t_len / 256;
  2541.  
  2542.  dom_m_len = dom_len * 2;
  2543.  dom_m_len_lo = dom_m_len % 256;
  2544.  dom_m_len_hi = dom_m_len / 256;
  2545.  
  2546.  dom_mm_len = dom_m_len + 2;
  2547.  dom_mm_len_lo = dom_mm_len % 256;
  2548.  dom_mm_len_hi = dom_mm_len / 256;
  2549.  
  2550.  
  2551.  req = raw_string(0x00, 0x00,
  2552.           tot_len_hi, tot_len_lo, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00,
  2553.          0x00, 0x00, 0x00, 0x18, 0x07, 0xC8, 0x00, 0x00,
  2554.          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  2555.          0x00, 0x00, tid_lo, tid_hi, 0x00, 0x28, uid_lo, uid_hi,
  2556.          g_mlo, g_mhi, 0x10, 0x00, 0x00, tot_dat_count_lo, tot_dat_count_hi, 0x00,
  2557.          0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
  2558.          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54,
  2559.          0x00, tot_dat_count_lo, tot_dat_count_hi, 0x54, 0x00, 0x02, 0x00, 0x26,
  2560.          0x00, pipe_lo, pipe_hi, bcc_lo, bcc_hi, 0x00, 0x5C, 0x00,
  2561.          0x50, 0x00, 0x49, 0x00, 0x50, 0x00, 0x45, 0x00,
  2562.          0x5C, 0x00, 0x00, 0x00, 0xAF, 0x47, 0x05, 0x00,
  2563.          0x00, 0x03, 0x10, 0x00, 0x00, 0x00, tot_dat_count_lo, tot_dat_count_hi,
  2564.          0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x38, 0x00,
  2565.          0x00, 0x00, 0x00, 0x00, 0x05, 0x00) + samrhdl + 
  2566.    raw_string(     dom_m_len_lo, dom_m_len_hi, dom_mm_len_lo, dom_mm_len_hi, 0x40, 0x7B,
  2567.             0x13, 0x00, dom_t_len_lo, dom_t_len_hi, 0x00, 0x00, 0x00, 0x00,
  2568.          0x00, 0x00, dom_len_lo, dom_len_hi, 0x00) + dom + raw_string(0x00);
  2569.          
  2570.   send(socket:soc, data:req);
  2571.   r = smb_recv(socket:soc, length:4096);
  2572.   if(strlen(r) < 88)return(FALSE);
  2573.   #display(ord(r[88]), "\n");  
  2574.   
  2575.   _sid = "";
  2576.   
  2577.   for(i=0;i<28;i=i+1)
  2578.   {
  2579.    _sid = _sid + raw_string(ord(r[88+i]));
  2580.    #display(hex(ord(r[88+i])),  " ");
  2581.   }
  2582.   #display("\n");
  2583.   return(_sid);
  2584. }
  2585.  
  2586.  
  2587. #------------------------------------------------------#
  2588. # Opens a policy handle to a given domain              #
  2589. #------------------------------------------------------#
  2590. function SamrOpenDomain(soc, tid, uid, pipe, samrhdl, sid)
  2591. {
  2592.  
  2593.  #display("sid = ", strlen(sid), "\n");
  2594.  tid_hi = tid / 256;
  2595.  tid_lo = tid % 256;
  2596.  uid_hi = uid / 256;
  2597.  uid_lo = uid % 256;
  2598.  
  2599.  pipe_hi = pipe / 256;
  2600.  pipe_lo = pipe % 256;
  2601.  
  2602.  
  2603.  len = 132 + strlen(sid);
  2604.  len_h = len / 256;
  2605.  len_l = len % 256;
  2606.  
  2607.  tdc = 48 + strlen(sid);
  2608.  tdc_l = tdc % 256;
  2609.  tdc_h = tdc / 256;
  2610.  
  2611.  bcc = tdc + 17;
  2612.  bcc_l = bcc % 256;
  2613.  bcc_h = bcc / 256;
  2614.  req = raw_string(0x00, 0x00,
  2615.            0x00, 0xA0, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00,
  2616.           0x00, 0x00, 0x00, 0x18, 0x07, 0xC8, 0x00, 0x00,
  2617.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  2618.           0x00, 0x00, tid_lo, tid_hi, 0x00, 0x28, uid_lo, uid_hi,
  2619.           g_mlo, g_mhi, 0x10, 0x00, 0x00, 0x4C, 0x00, 0x00,
  2620.           0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
  2621.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54,
  2622.           0x00, 0x4C, 0x00, 0x54, 0x00, 0x02, 0x00, 0x26,
  2623.           0x00, pipe_lo, pipe_hi, 0x5D, 0x00, 0x00, 0x5C, 0x00,
  2624.           0x50, 0x00, 0x49, 0x00, 0x50, 0x00, 0x45, 0x00,
  2625.           0x5C, 0x00, 0x00, 0x00, 0x33, 0x00, 0x05, 0x00,
  2626.           0x00, 0x03, 0x10, 0x00, 0x00, 0x00, 0x4C, 0x00,
  2627.           0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x34, 0x00,
  2628.           0x00, 0x00, 0x00, 0x00, 0x07, 0x00) + samrhdl +
  2629.     raw_string(0x00, 0x02, 0x00, 0x00) + sid;
  2630.           
  2631.           
  2632.           
  2633.  send(socket:soc, data:req);
  2634.  r = smb_recv(socket:soc, length:4096);
  2635.  if(strlen(r) < 30)
  2636.      return(FALSE);
  2637.     
  2638.  #display(strlen(r),"\n");
  2639.  samrhdl = "";
  2640.  _len = strlen(r);
  2641.  _len = _len - 24;
  2642.  _z = 0;
  2643.  for(i=0;i<20;i=i+1)
  2644.  {
  2645.   if(ord(r[i+_len]) == 0)_z = _z + 1;
  2646.   samrhdl = samrhdl + raw_string(ord(r[i+_len]));
  2647.   #display(hex(ord(r[i+_len])), " ");
  2648.  }
  2649.  #display("\n");
  2650.  #display("samhdl : ", strlen(samrhdl), "\n");
  2651.  if(_z == 20)return(NULL);
  2652.  
  2653.  return(samrhdl);
  2654. }          
  2655.  
  2656.  
  2657. #------------------------------------------------------#
  2658. # NetUserModalsGet - does not work yet               #
  2659. #------------------------------------------------------#
  2660. function SamrQueryDomainInfo(soc, tid, uid, pipe, samrhdl,  level)
  2661. {
  2662.  #display("sid = ", strlen(sid), "\n");
  2663.  tid_hi = tid / 256;
  2664.  tid_lo = tid % 256;
  2665.  uid_hi = uid / 256;
  2666.  uid_lo = uid % 256;
  2667.  
  2668.  pipe_hi = pipe / 256;
  2669.  pipe_lo = pipe % 256;
  2670.  
  2671.  
  2672.  req = raw_string(0x00, 0x00,
  2673.            0x00, 0x82, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00,
  2674.           0x00, 0x00, 0x00, 0x18, 0x07, 0xC8, 0x00, 0x00,
  2675.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  2676.           0x00, 0x00, tid_lo, tid_hi, 0x00, 0x28, uid_lo, uid_hi,
  2677.           g_mlo, g_mhi, 0x10, 0x00, 0x00, 0x2e, 0x00, 0x00,
  2678.           0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
  2679.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54,
  2680.           0x00, 0x2e, 0x00, 0x54, 0x00, 0x02, 0x00, 0x26,
  2681.           0x00, pipe_lo, pipe_hi, 0x3f, 0x00, 0x00, 0x5C, 0x00,
  2682.           0x50, 0x00, 0x49, 0x00, 0x50, 0x00, 0x45, 0x00,
  2683.           0x5C, 0x00, 0x00, 0x00, 0x45, 0x00, 0x05, 0x00,
  2684.           0x00, 0x03, 0x10, 0x00, 0x00, 0x00, 0x2E, 0x00,
  2685.           0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x16, 0x00,
  2686.           0x00, 0x00, 0x00, 0x00, 0x08, 0x00) + samrhdl +
  2687.     raw_string(level % 256, level / 256);
  2688.           
  2689.           
  2690.           
  2691.  send(socket:soc, data:req);
  2692.  r = smb_recv(socket:soc, length:4096);
  2693.  if(strlen(r) < 30)
  2694.      return(FALSE);
  2695.  
  2696.  return r;    
  2697. }          
  2698.  
  2699.  
  2700. function SamrOpenBuiltin(soc, tid, uid, pipe, samrhdl)
  2701. {
  2702.  tid_hi = tid / 256;
  2703.  tid_lo = tid % 256;
  2704.  uid_hi = uid / 256;
  2705.  uid_lo = uid % 256;
  2706.  
  2707.  pipe_hi = pipe / 256;
  2708.  pipe_lo = pipe % 256;
  2709.  
  2710.  req = raw_string(0x00, 0x00,
  2711.            0x00, 0x94, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00,
  2712.           0x00, 0x00, 0x00, 0x18, 0x07, 0xC8, 0x00, 0x00,
  2713.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  2714.           0x00, 0x00, tid_lo, tid_hi, 0x00, 0x28, uid_lo, uid_hi,
  2715.           g_mlo, g_mhi, 0x10, 0x00, 0x00, 0x40, 0x00, 0x00,
  2716.           0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
  2717.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54,
  2718.           0x00, 0x40, 0x00, 0x54, 0x00, 0x02, 0x00, 0x26,
  2719.           0x00, pipe_lo, pipe_hi, 0x51, 0x00, 0x00, 0x5C, 0x00,
  2720.           0x50, 0x00, 0x49, 0x00, 0x50, 0x00, 0x45, 0x00,
  2721.           0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
  2722.           0x00, 0x03, 0x10, 0x00, 0x00, 0x00, 0x40, 0x00,
  2723.           0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x28, 0x00,
  2724.           0x00, 0x00, 0x00, 0x00, 0x07, 0x00) + samrhdl +
  2725.        raw_string(            0x80, 0x02, 0x00, 0x00, 0x01, 0x00,
  2726.                  0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00,
  2727.           0x00, 0x05, 0x20, 0x00, 0x00, 0x00);
  2728.           
  2729.  send(socket:soc, data:req);
  2730.  r = smb_recv(socket:soc, length:4096);
  2731.  builtinhdl = "";
  2732.  _len = strlen(r);
  2733.  _len = _len - 24;
  2734.  _z  = 0;
  2735.  for(i=0;i<20;i=i+1)
  2736.  { 
  2737.   if(ord(r[i+_len]) == 0)_z = _z + 1;
  2738.   builtinhdl = builtinhdl + raw_string(ord(r[i+_len]));
  2739.   #display(hex(ord(r[i+_len])), " ");
  2740.  }
  2741.  if(_z == 20)return(NULL);
  2742. #display("\n");
  2743. #display("builtinhdl : ", strlen(builtinhdl), "\n");
  2744.  return(builtinhdl);
  2745.  
  2746.            
  2747. }
  2748.  
  2749.  
  2750. #------------------------------------------------------#
  2751. # Converts a username to its rid                       #
  2752. #------------------------------------------------------#
  2753. function SamrLookupNames(soc, uid, tid, pipe, name, domhdl)
  2754. {
  2755.  tid_hi = tid / 256;
  2756.  tid_lo = tid % 256;
  2757.  uid_hi = uid / 256;
  2758.  uid_lo = uid % 256;
  2759.  
  2760.  pipe_hi = pipe / 256;
  2761.  pipe_lo = pipe % 256;
  2762.  
  2763.  usr = samr_uc(name:name);
  2764.  len = 164 + strlen(usr);
  2765.  len_hi = len / 256;
  2766.  len_lo = len % 256;
  2767.  
  2768.  
  2769.  
  2770.  tdc = 80 + strlen(usr);
  2771.  tdc_l = tdc % 256;
  2772.  tdc_h = tdc / 256;
  2773.  
  2774.  bcc = tdc + 17;
  2775.  bcc_l = bcc % 256;
  2776.  bcc_h = bcc / 256;
  2777.  
  2778.  x = strlen(usr) / 2;
  2779.  x_h = x / 256;
  2780.  x_l = x % 256;
  2781.  
  2782.  y = x + 1;
  2783.  y_h = y / 256;
  2784.  y_l = y % 256;
  2785.  
  2786.  z = strlen(usr);
  2787.  z_l = z % 256;
  2788.  z_h = z / 256;
  2789.  
  2790.  t = z + 2;
  2791.  t_l = t % 256;
  2792.  t_h = t / 256;
  2793.  
  2794.  
  2795.  req = raw_string(0x00, 0x00, 
  2796.            len_hi, len_lo, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00,
  2797.           0x00, 0x00, 0x00, 0x18, 0x07, 0xC8, 0x00, 0x00,
  2798.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  2799.           0x00, 0x00, tid_lo, tid_hi, 0x00, 0x28, uid_lo, uid_hi,
  2800.           g_mlo, g_mhi, 0x10, 0x00, 0x00, tdc_l, tdc_h, 0x00,
  2801.           0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
  2802.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54,
  2803.           0x00, tdc_l, tdc_h, 0x54, 0x00, 0x02, 0x00, 0x26,
  2804.           0x00, pipe_lo, pipe_hi, bcc_l, bcc_h, 0x00, 0x5C, 0x00,
  2805.           0x50, 0x00, 0x49, 0x00, 0x50, 0x00, 0x45, 0x00,
  2806.           0x5C, 0x00, 0x00, 0x00, 0xAF, 0x47, 0x05, 0x00,
  2807.           0x00, 0x03, 0x10, 0x00, 0x00, 0x00, tdc_l, tdc_h,
  2808.           0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x44, 0x00,
  2809.           0x00, 0x00, 0x00, 0x00, 0x11, 0x00) + domhdl +
  2810.           raw_string(0x01, 0x00, 0x00, 0x00, 0xE8, 0x03,
  2811.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
  2812.           0x00, 0x00, z_l, z_h, t_l, t_h, 0xD8, 0x0E, 
  2813.           0x41, 0x00, y_l, y_h, 0x00, 0x00, 0x00, 0x00,
  2814.           0x00, 0x00, x_l, x_h, 0x00) + usr + 
  2815.           raw_string(0x00);
  2816.  send(socket:soc, data:req);
  2817.  r = smb_recv(socket:soc, length:4096);        
  2818.  
  2819.  if(strlen(r) < 100)return(FALSE);
  2820.  
  2821.  _rid = "";
  2822. ##display("RID : ");
  2823.  _z = 0;
  2824.  for(i=0;i<4;i=i+1)
  2825.  {
  2826.   if(ord(r[96+i]) == 0)_z = _z + 1;
  2827. #  ##display(hex(ord(r[96+i])), " ");
  2828.   _rid = _rid + raw_string(ord(r[96+i]));
  2829.  }
  2830. ##display("\n");
  2831.  if(_z == 4)return(NULL);
  2832.  
  2833.  return(_rid);
  2834. }
  2835.  
  2836. #--------------------------------------------------------#
  2837. # Opens a policy handle to a given user                  #
  2838. #--------------------------------------------------------#
  2839. function SamrOpenUser(soc, uid, tid, pipe, samrhdl, rid)
  2840. {
  2841.  tid_hi = tid / 256;
  2842.  tid_lo = tid % 256;
  2843.  uid_hi = uid / 256;
  2844.  uid_lo = uid % 256;
  2845.  
  2846.  pipe_hi = pipe / 256;
  2847.  pipe_lo = pipe % 256;
  2848.  
  2849.  len = 176;
  2850.  len_hi = len / 256;
  2851.  len_lo = len % 256;
  2852.  
  2853.  req = raw_string(0x00, 0x00,
  2854.            0x00, 0x88, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00,
  2855.           0x00, 0x00, 0x00, 0x18, 0x07, 0xC8, 0x00, 0x00,
  2856.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  2857.           0x00, 0x00, tid_lo, tid_hi, 0x00, 0x28, uid_lo, uid_hi,
  2858.           g_mlo, g_mhi, 0x10, 0x00, 0x00, 0x34, 0x00, 0x00,
  2859.           0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
  2860.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54,
  2861.           0x00, 0x34, 0x00, 0x54, 0x00, 0x02, 0x00, 0x26,
  2862.           0x00, pipe_lo, pipe_hi, 0x45, 0x00, 0x00, 0x5C, 0x00,
  2863.           0x50, 0x00, 0x49, 0x00, 0x50, 0x00, 0x45, 0x00,
  2864.           0x5C, 0x00, 0x00, 0x00, 0x33, 0x00, 0x05, 0x00,
  2865.           0x00, 0x03, 0x10, 0x00, 0x00, 0x00, 0x34, 0x00,
  2866.           0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x1c, 0x00,
  2867.           0x00, 0x00, 0x00, 0x00, 0x22, 0x00) + samrhdl +
  2868.     raw_string(0x1B, 0x01, 0x02, 0x00) + rid;
  2869.  
  2870.  send(socket:soc, data:req);
  2871.  r = smb_recv(socket:soc, length:4096);
  2872.  if(strlen(r) < 100)return(FALSE);
  2873.  
  2874.  _usrhdl = "";
  2875.  _len = strlen(r);
  2876.  _len = _len - 24;
  2877.  #display("usrhdl = ");
  2878.  _z = 0;
  2879.  for(i=0;i<20;i=i+1)
  2880.  {
  2881.   if(ord(r[i+_len]) == 0)_z = _z + 1;
  2882.   _usrhdl = _usrhdl + raw_string(ord(r[i+_len]));
  2883.   #display(hex(ord(r[i+_len])), " ");
  2884.  }
  2885.  
  2886.  if(_z == 20)return(NULL);
  2887.  
  2888.  #display("\n");
  2889.  return(_usrhdl);
  2890. }
  2891.  
  2892. #-------------------------------------------------------#
  2893. # Requests the list of groups to which the user belongs #
  2894. # to                                #
  2895. #-------------------------------------------------------#
  2896.  
  2897. function SamrQueryUserGroups(soc, uid, tid, pipe, usrhdl)
  2898. {
  2899.  tid_hi = tid / 256;
  2900.  tid_lo = tid % 256;
  2901.  uid_hi = uid / 256;
  2902.  uid_lo = uid % 256;
  2903.  
  2904.  pipe_hi = pipe / 256;
  2905.  pipe_lo = pipe % 256;
  2906.  
  2907.  req = raw_string(0x00, 0x00,
  2908.            0x00, 0x80, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00,
  2909.           0x00, 0x00, 0x00, 0x18, 0x07, 0xC8, 0x00, 0x00,
  2910.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  2911.           0x00, 0x00, tid_lo, tid_hi, 0x00, 0x28, uid_lo, uid_hi,
  2912.           g_mlo, g_mhi, 0x10, 0x00, 0x00, 0x2C, 0x00, 0x00,
  2913.           0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
  2914.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54,
  2915.           0x00, 0x2C, 0x00, 0x54, 0x00, 0x02, 0x00, 0x26, 
  2916.           0x00, pipe_lo, pipe_hi, 0x3D, 0x00, 0x00, 0x5C, 0x00,
  2917.           0x50, 0x00, 0x49, 0x00, 0x50, 0x00, 0x45, 0x00,
  2918.           0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
  2919.           0x00, 0x03, 0x10, 0x00, 0x00, 0x00, 0x2C, 0x00,
  2920.           0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x14, 0x00,
  2921.           0x00, 0x00, 0x00, 0x00, 0x27, 0x00) + usrhdl;
  2922.           
  2923.  send(socket:soc, data:req);
  2924.  r = recv(socket:soc, length:4096); 
  2925.  
  2926.  
  2927.  num_lo = ord(r[88]);
  2928.  num_hi = ord(r[89]);
  2929.  
  2930.  num = num_hi * 256;
  2931.  num = num + num_lo;
  2932.  
  2933.  #
  2934.  # Ok. Our user is in <num> groups. Let's decode their RID
  2935.  #
  2936.  
  2937.  if(strlen(r) < 103)
  2938.      return(FALSE);
  2939.  base = 100;
  2940.  rids = "";
  2941.  for(i=0;i<num;i=i+1)
  2942.  {
  2943.   g_rid = string(hex(ord(r[base+3])), "-", 
  2944.              hex(ord(r[base+2])), "-",
  2945.            hex(ord(r[base+1])), "-",
  2946.            hex(ord(r[base])));
  2947.        
  2948.   base = base + 8;
  2949.   rids = rids + g_rid + string("\n");
  2950.  }    
  2951.   return(rids);
  2952. }
  2953. #------------------------------------------------------#
  2954. # Queries information about a given user               #
  2955. #------------------------------------------------------#
  2956. function SamrQueryUserInfo(soc, uid, tid, pipe, usrhdl)
  2957. {
  2958.  tid_hi = tid / 256;
  2959.  tid_lo = tid % 256;
  2960.  uid_hi = uid / 256;
  2961.  uid_lo = uid % 256;
  2962.  
  2963.  pipe_hi = pipe / 256;
  2964.  pipe_lo = pipe % 256;
  2965.  
  2966.  req = raw_string(0x00, 0x00,
  2967.            0x00, 0x82, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00,
  2968.           0x00, 0x00, 0x00, 0x18, 0x07, 0xC8, 0x00, 0x00,
  2969.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  2970.           0x00, 0x00, tid_lo, tid_hi, 0x00, 0x28, uid_lo, uid_hi,
  2971.           g_mlo, g_mhi, 0x10, 0x00, 0x00, 0x2E, 0x00, 0x00,
  2972.           0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
  2973.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54,
  2974.           0x00, 0x2E, 0x00, 0x54, 0x00, 0x02, 0x00, 0x26,
  2975.           0x00, pipe_lo, pipe_hi, 0x3F, 0x00, 0x00, 0x5C, 0x00,
  2976.           0x50, 0x00, 0x49, 0x00, 0x50, 0x00, 0x45, 0x00,
  2977.           0x5C, 0x00, 0x00, 0x00, 0x33, 0x00, 0x05, 0x00,
  2978.           0x00, 0x03, 0x10, 0x00, 0x00, 0x00, 0x2E, 0x00,
  2979.           0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x16, 0x00,
  2980.           0x00, 0x00, 0x00, 0x00, 0x24, 0x00) + usrhdl +
  2981.           raw_string(0x15, 0x00);
  2982.           
  2983.  send(socket:soc, data:req);
  2984.  r = smb_recv(socket:soc, length:4096);
  2985.            
  2986.  return(r);
  2987. }
  2988.  
  2989.  
  2990. #-------------------------------------------------------#
  2991. # Requests the list of aliases to which the user belongs #
  2992. # to                                #
  2993. #-------------------------------------------------------#
  2994.  
  2995.  
  2996. function SamrQueryUserAliases(soc, uid, tid, pipe, usrhdl, sid, rid)
  2997. {
  2998.  tid_hi = tid / 256;
  2999.  tid_lo = tid % 256;
  3000.  uid_hi = uid / 256;
  3001.  uid_lo = uid % 256;
  3002.  
  3003.  pipe_hi = pipe / 256;
  3004.  pipe_lo = pipe % 256;
  3005.  
  3006.  subsid = "";
  3007.  
  3008.  for(i=0;i<20;i=i+1)
  3009.  {
  3010.   subsid = subsid + raw_string(ord(sid[8+i]));
  3011.   #display(hex(ord(sid[8+i])), " ");
  3012.  }
  3013.  #display("\n");
  3014.  
  3015.  
  3016.  
  3017.  
  3018.  req = raw_string(0x00, 0x00, 
  3019.            0x00, 0xB0, 0xFF, 0x53, 0x4D, 0x42, 0x25, 0x00,
  3020.           0x00, 0x00, 0x00, 0x18, 0x07, 0xC8, 0x00, 0x00,
  3021.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  3022.           0x00, 0x00, tid_lo, tid_hi, 0x00, 0x28, uid_lo, uid_hi,
  3023.           g_mlo, g_mhi, 0x10, 0x00, 0x00, 0x5C, 0x00, 0x00,
  3024.           0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 
  3025.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54,
  3026.           0x00, 0x5C, 0x00, 0x54, 0x00, 0x02, 0x00, 0x26,
  3027.           0x00, pipe_lo, pipe_hi, 0x6D, 0x00, 0x00, 0x5C, 0x00,
  3028.           0x50, 0x00, 0x49, 0x00, 0x50, 0x00, 0x45, 0x00,
  3029.           0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,
  3030.           0x00, 0x03, 0x10, 0x00, 0x00, 0x00, 0x5C, 0x00,
  3031.           0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x44, 0x00,
  3032.           0x00, 0x00, 0x00, 0x00, 0x10, 0x00) + usrhdl +
  3033.        raw_string(0x01, 0x00, 0x00, 0x00, 0x88, 0x7C,
  3034.                   0x13, 0x00, 0x01, 0x00, 0x00, 0x00, 0x98, 0x7C,
  3035.           0x13, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x05,
  3036.           0x00, 0x00) + subsid + rid;
  3037.           
  3038.  send(socket:soc, data:req);
  3039.  r = smb_recv(socket:soc, length:4096);
  3040.  
  3041.  if(strlen(r) < 100){
  3042.      #display("=====>", strlen(r), "<====\n");
  3043.      return(FALSE);
  3044.     }
  3045.  
  3046.  
  3047.  num_lo = ord(r[92]);
  3048.  num_hi = ord(r[93]);
  3049.  
  3050.  num = num_hi * 256;
  3051.  num = num + num_lo;
  3052.  #display("NUM EGAL : ", num, "\n");
  3053.  base = 96;
  3054.  rids = "";
  3055.  for(i=0;i<num;i=i+1)
  3056.  {
  3057.   _rid = string(hex(ord(r[base+3])), "-",
  3058.           hex(ord(r[base+2])), "-",
  3059.         hex(ord(r[base+1])), "-",
  3060.         hex(ord(r[base])));
  3061.         
  3062.   rids = rids + _rid + string("\n");        
  3063.   base = base + 4;        
  3064.  }      
  3065.  return(rids);
  3066. }        
  3067.  
  3068.  
  3069. function _ExtractTime(buffer, base)
  3070. {
  3071. if (strlen(buffer) < base + 8) return(FALSE);
  3072.  
  3073.  return(string(      hex(ord(buffer[base+7])), "-",
  3074.               hex(ord(buffer[base+6])), "-",
  3075.              hex(ord(buffer[base+5])), "-",
  3076.              hex(ord(buffer[base+4])), "-",
  3077.              hex(ord(buffer[base+3])), "-",
  3078.              hex(ord(buffer[base+2])), "-",
  3079.              hex(ord(buffer[base+1])), "-",
  3080.              hex(ord(buffer[base]))));
  3081. }
  3082.  
  3083.  
  3084. #------------------------------------------------------#
  3085. # Decodes the informations received about a given usr  #
  3086. # This function is not part of MSDN, hence the under-  #
  3087. # score in front of it                                 #
  3088. #------------------------------------------------------#
  3089.  
  3090. function _SamrDecodeUserInfo(info, count, type)
  3091. {
  3092.  lim = strlen(info);
  3093.  
  3094.  
  3095.  
  3096.  if(strlen(info) < 100)
  3097.      return(FALSE);
  3098.     
  3099.  
  3100.  #
  3101.  # Various times
  3102.  #
  3103.  
  3104.  logon = _ExtractTime(buffer:info, base:92);
  3105.  #display("Logon time : ", logon, "\n");
  3106.  
  3107.  set_kb_item(name:string("SMB/", type, "/", count, "/Info/LogonTime"),
  3108.           value:logon);
  3109.          
  3110.  
  3111.  logoff = _ExtractTime(buffer:info, base:100);
  3112.  #display("Logoff time : ", logoff, "\n");
  3113.   set_kb_item(name:string("SMB/", type, "/", count, "/Info/LogoffTime"),
  3114.           value:logoff);
  3115.  
  3116.  if(strlen(info) < 116)
  3117.      return(FALSE);
  3118.  
  3119.  
  3120.  kickoff = _ExtractTime(buffer:info, base:108);
  3121.  #display("Kickoff time : ", kickoff, "\n");
  3122.   set_kb_item(name:string("SMB/", type, "/", count, "/Info/KickoffTime"),
  3123.           value:kickoff);
  3124.          
  3125.  base = 116;
  3126.  pass_last_set = _ExtractTime(buffer:info, base:116);
  3127.  
  3128.  if(strlen(info) < 124)
  3129.      return(FALSE);
  3130.  
  3131.  
  3132.  #display("Pass last set : ", pass_last_set, "\n");             
  3133.  set_kb_item(name:string("SMB/", type, "/", count, "/Info/PassLastSet"),
  3134.           value:pass_last_set); 
  3135.          
  3136.          
  3137.  pass_can_change = _ExtractTime(buffer:info, base:124);
  3138.  #display("Pass can change : ", pass_can_change,"\n");
  3139.   set_kb_item(name:string("SMB/", type, "/", count, "/Info/PassCanChange"),
  3140.           value:pass_can_change);
  3141.  
  3142.  pass_must_change = _ExtractTime(buffer:info, base:132);
  3143.  
  3144.  #display("Pass must change : ", pass_must_change, "\n");
  3145.   set_kb_item(name:string("SMB/", type, "/", count, "/Info/PassMustChange"),
  3146.           value:pass_must_change);
  3147.  
  3148.  #
  3149.  # ACB
  3150.  #
  3151.  
  3152.  if(strlen(info) < 260)
  3153.  {
  3154.   return(FALSE);
  3155.  }
  3156.  
  3157.  acb_lo = ord(info[260]);
  3158.  acb_hi = ord(info[261]);
  3159.  acb = acb_hi * 256;
  3160.  acb = acb + acb_lo;
  3161.  #display("ACB : ", hex(acb), "\n");
  3162.  
  3163.   set_kb_item(name:string("SMB/", type, "/", count, "/Info/ACB"),
  3164.           value:acb);
  3165.          
  3166.          
  3167.  #if(acb & 0x01)display("  Account is disabled\n");
  3168.  #if(acb & 0x04)display("  Password not required\n");
  3169.  #if(acb & 0x10)display("  Normal account\n");
  3170.  #if(acb & 0x0200)display("  Password does not expire\n");
  3171.  #if(acb & 0x0400)display("  Account auto-locked\n");
  3172.  #if(acb & 0x0800)display("  Password can't be changed\n");
  3173.   
  3174.  #if(acb & 0x1000)display("  Smart card is required for interactive log on\n");
  3175.  #if(acb & 0x2000)display("  Account is trusted for delegation\n");
  3176.  #if(acb & 0x4000)display("  Account is sensitive an can not be delegated\n");
  3177.  #if(acb & 0x8000)display("  Use DES encryption type for this account\n");
  3178.  
  3179. }
  3180.  
  3181.  
  3182.  
  3183. #-------------------------------------------------------------------#
  3184.  
  3185.  
  3186.  
  3187. #
  3188. # Open file <file>
  3189. #
  3190. function OpenAndX(socket, uid, tid, file)
  3191. {
  3192.  local_var req, tid_lo, tid_hi, uid_lo, uid_hi, len_lo, len_hi, rep;
  3193.  local_var fid_lo, fid_hi;
  3194.  
  3195.  
  3196.  len_lo = (66 + strlen(file)) % 256;
  3197.  len_hi = (66 + strlen(file)) / 256;
  3198.  
  3199.  tid_lo = tid % 256;
  3200.  tid_hi = tid / 256;
  3201.  
  3202.  uid_lo = uid % 256;
  3203.  uid_hi = uid / 256;
  3204.  
  3205.  bcc_lo = strlen(file) % 256;
  3206.  bcc_hi = strlen(file) / 256;
  3207.  
  3208.  
  3209.  req = raw_string(0x00, 0x00, len_hi, len_lo,   0xFF, 0x53,
  3210.            0x4D, 0x42, 0x2D, 0x00, 0x00, 0x00, 0x00, 0x08,
  3211.           0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  3212.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, tid_lo, tid_hi,
  3213.           0x00, 0x28, uid_lo, uid_hi, g_mlo, g_mhi, 0x0F, 0xFF,
  3214.           0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x06,
  3215.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
  3216.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  3217.           0x00, 0x00, 0x00, 0x00, 0x00, bcc_lo, bcc_hi) + file +
  3218.           raw_string(0x00);
  3219.  
  3220.  
  3221.  
  3222.  send(socket:soc, data:req);
  3223.  rep = smb_recv(socket:socket, length:4096);
  3224.  if(strlen(rep) < 65)return(NULL);
  3225.  else
  3226.   {
  3227.    fid_lo = ord(rep[41]);
  3228.    fid_hi = ord(rep[42]);
  3229.    
  3230.    return(fid_lo + (fid_hi * 256));
  3231.   }
  3232. }
  3233.  
  3234.  
  3235. #
  3236. # Read <count> bytes at offset <off>
  3237. #
  3238. function ReadAndX(socket, uid, tid, fid, count, off)
  3239. {
  3240.  local_var r, req, uid_lo, uid_hi, tid_lo, tid_hi, fid_lo, fid_hi, off_hi, off_lo, ret, i;
  3241.  
  3242.  uid_lo = uid % 256; uid_hi = uid / 256;
  3243.  tid_lo = tid % 256; tid_hi = tid / 256;
  3244.  fid_lo = fid % 256; fid_hi = fid / 256;
  3245.  cnt_lo = count % 256; cnt_hi = count / 256;
  3246.  
  3247.  off_lo_lo = off % 256;  off /= 256;
  3248.  off_lo_hi = off % 256;  off /= 256;
  3249.  off_hi_lo = off % 256;  off /= 256;
  3250.  off_hi_hi = off;
  3251.  
  3252.  req = raw_string(0x00, 0x00, 0x00, 0x37, 0xFF, 0x53,
  3253.            0x4D, 0x42, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x08,
  3254.           0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  3255.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, tid_lo, tid_hi,
  3256.           0x00, 0x28, uid_lo, uid_hi, g_mlo, g_mhi, 0x0A, 0xFF,
  3257.           0x00, 0x00, 0x00, fid_lo, fid_hi, off_lo_lo, off_lo_hi, off_hi_lo, 
  3258.           off_hi_hi, cnt_lo, cnt_hi, cnt_lo, cnt_hi, 0x00, 0x00,
  3259.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
  3260.  
  3261.  send(socket:socket, data:req);
  3262.  r = smb_recv(socket:socket, length:65535);
  3263.  ret = "";
  3264.  if(strlen(r) < 37 + 28)return(NULL);
  3265.  return substr(r, 36+28, strlen(r) - 1);       
  3266. }
  3267.  
  3268.  
  3269. # Returns the size of the file pointed by <fid>
  3270. function smb_get_file_size(socket, uid, tid, fid)
  3271. {
  3272.  local_var r, req, uid_lo, uid_hi, tid_lo, tid_hi, fid_lo, fid_hi, ret;
  3273.  
  3274.  uid_lo = uid % 256; uid_hi = uid / 256;
  3275.  tid_lo = tid % 256; tid_hi = tid / 256;
  3276.  fid_lo = fid % 256; fid_hi = fid / 256;
  3277.  
  3278.  
  3279.  req = raw_string(0x00, 0x00, 0x00, 0x48, 0xFF, 0x53,
  3280.            0x4D, 0x42, 0x32, 0x00, 0x00, 0x00, 0x00, 0x08,
  3281.           0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  3282.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, tid_lo, tid_hi,
  3283.           0x00, 0x28, uid_lo, uid_hi, g_mlo, g_mhi, 0x0F, 0x04,
  3284.           0x00, 0x00, 0x00, 0x02, 0x00, 0x04, 0x11, 0x00,
  3285.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  3286.           0x00, 0x04, 0x00, 0x44, 0x00, 0x00, 0x00, 0x48,
  3287.           0x00, 0x01, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00,
  3288.           0x44, 0x20, fid_lo, fid_hi, 0x07, 0x01);
  3289.           
  3290.  send(socket:socket, data:req);
  3291.  r = smb_recv(socket:soc, length:4096);
  3292.  if(strlen(r) < 112) return -1;
  3293.  
  3294.  ret = ord(r[115]);            
  3295.  ret = ret * 256 + ord(r[114]);        
  3296.  ret = ret * 256 + ord(r[113]);
  3297.  ret = ret * 256 + ord(r[112]);        
  3298.  
  3299.  return ret;
  3300. }
  3301.  
  3302. #
  3303. # Gives the listing in the pattern <pattern> 
  3304. # If pattern is set to NULL, then we return the
  3305. # content of the root (\*)
  3306. #
  3307. function FindFirst2(socket, uid, tid, pattern)
  3308. {
  3309.  local_var uid_lo, uid_hi, tid_lo, tid_hi, r, r2;
  3310.  local_var t, nxt, off, name, ret, bcc, bcc_lo, bcc_hi;
  3311.  local_var len, len_lo, len_hi;
  3312.  local_var unicode_pattern, i;
  3313.  local_var data_off, data_off_lo, data_off_hi, bcc2, bcc2_lo, bcc2_hi;
  3314.  local_var eof, search_id, err;
  3315.  
  3316.  
  3317.  if(isnull(pattern))pattern = "\*";
  3318.  
  3319.  for(i=0;i<strlen(pattern);i++)
  3320.  {
  3321.   unicode_pattern += pattern[i] + raw_string(0);
  3322.  }
  3323.  unicode_pattern += raw_string(0, 0);
  3324.  
  3325.  
  3326.  ret = NULL;
  3327.  
  3328.   
  3329.  bcc = 15 + strlen(unicode_pattern);
  3330.  bcc2 = bcc - 3;
  3331.  len    = 80 + strlen(unicode_pattern);
  3332.  
  3333.  uid_lo = uid % 256; uid_hi = uid / 256;
  3334.  tid_lo = tid % 256; tid_hi = tid / 256;
  3335.  bcc_lo = bcc % 256; bcc_hi = bcc / 256;
  3336.  bcc2_lo = bcc2 % 256; bcc2_hi = bcc2 / 256;
  3337.  len_lo = len % 256; len_hi = len / 256;
  3338.  
  3339.  data_off = 80 + strlen(unicode_pattern);
  3340.  data_off_lo = data_off % 256; data_off_hi = data_off / 256;
  3341.  
  3342.  req = raw_string(0x00, 0x00, len_hi, len_lo,   0xFF, 0x53,
  3343.            0x4D, 0x42, 0x32, 0x00, 0x00, 0x00, 0x00, 0x08,
  3344.            0x01, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  3345.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, tid_lo, tid_hi,
  3346.           0x00, 0x28, uid_lo, uid_hi, g_mlo, g_mhi, 0x0F, bcc2_lo,
  3347.           bcc2_hi, 0x00, 0x00, 0x0A, 0x00, 0x04, 0x11, 0x00,
  3348.           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  3349.           0x00, bcc2_lo, bcc2_hi, 0x44, 0x00, 0x00, 0x00, data_off_lo,
  3350.           data_off_hi, 0x01, 0x00, 0x01, 0x00, bcc_lo, bcc_hi, 0x00,
  3351.           0x44, 0x20, 0x16, 0x00, 0x00, 0x02, 0x06, 0x00,
  3352.           0x04, 0x01, 0x00, 0x00, 0x00, 0x00) + unicode_pattern;
  3353.  
  3354.  send(socket:soc, data:req);
  3355.  r = smb_recv(socket:soc, length:65535);
  3356.  if(strlen(r) < 80)return(NULL);
  3357.  
  3358.  err = substr(r, 11, 12);
  3359.  if ( hexstr(err) != "0000" ) return NULL;
  3360.  
  3361.  search_id = substr(r, 60, 61);
  3362.  off = 72;
  3363.  while ( TRUE )
  3364.  {
  3365.  eof = ord(r[64]);
  3366.  while(TRUE)
  3367.  {
  3368.  t = 1;
  3369.  nxt = 0;
  3370.  
  3371.  if(off + i + 4 >= strlen(r))break;
  3372.  
  3373.  for(i=0;i<4;i++)
  3374.  {
  3375.  nxt += ord(r[off+i]) * t;
  3376.  t *= 256;
  3377.  }
  3378.  
  3379.  
  3380.  
  3381.  t = 1;
  3382.  len = 0;
  3383.  
  3384.  if( off+4+4+8+8+8+8+8+8+4+i+4 >= strlen(r))break;
  3385.  
  3386.  for(i=0;i<4;i++)
  3387.  {
  3388.  len += ord(r[off+4+4+8+8+8+8+8+8+4+i]) * t;
  3389.  t *= 256;
  3390.  }
  3391.  
  3392.  
  3393.  if(len >= strlen(r)) break;
  3394.     
  3395.  
  3396.  name = NULL;
  3397.  
  3398.  if(off+4+4+8+8+8+8+8+8+4+4+1+1+24+i+len >  strlen(r)) 
  3399.      break;
  3400.  
  3401.  for(i=0;i<len;i+=2)
  3402.  {
  3403.  name += r[off+4+4+8+8+8+8+8+8+4+4+4+1+1+24+i];
  3404.  }
  3405.  
  3406.  if( !isnull(name))
  3407.  {
  3408.  if(isnull(ret))
  3409.        ret = make_list(name);
  3410.  else
  3411.      ret = make_list(ret, name);
  3412.  }
  3413.  
  3414.  off = off + nxt;
  3415.  if(nxt == 0)break;
  3416.  if((off >= strlen(r)) || off < 0 )return ret;
  3417.  }
  3418.   if ( eof ) break;
  3419.   else {
  3420.     req = raw_string(0x00, 0x00, 0x00, 0x52, 0xff, 0x53, 0x4d, 0x42,
  3421.              0x32, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0xC0,
  3422.              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  3423.              0x00, 0x00, 0x00, 0x00, tid_lo, tid_hi, 0x00, 0x28,
  3424.              uid_lo, uid_hi, g_mlo, g_mhi, 0x0f, 0x0e, 0x00, 0x00,
  3425.              0x00, 0x0a, 0x00, 0x04, 0x11, 0x00, 0x00, 0x00, 
  3426.              0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e,
  3427.              0x00, 0x44, 0x00, 0x00, 0x00, 0x52, 0x00, 0x01,
  3428.              0x00, 0x02, 0x00, 0x11, 0x00, 0x00, 0x44, 0x20) + search_id + raw_string(0x00, 0x02, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00);
  3429.  
  3430.   send(socket:soc, data:req);
  3431.   r = smb_recv(socket:soc, length:65535);
  3432.   err = substr(r, 11, 12);
  3433.   if ( hexstr(err) != "0000" ) return NULL;
  3434.   if ( strlen(r) <= 64  && hexstr(substr(r, 9, 12)) == "00000000" ) r = smb_recv(socket:soc, length:65535);
  3435.   else if ( strlen(r) <= 64 ) break;
  3436.   off = 68;
  3437.   }
  3438.  }
  3439.  
  3440.  return ret;
  3441. }
  3442.  
  3443.  
  3444.  
  3445.  
  3446.  
  3447. function GetFileVersion(socket, uid, tid, fid)
  3448. {
  3449.  local_var i, fsize, data, off, tmp, version, v, len;
  3450.  
  3451.  fsize = smb_get_file_size(socket:socket, uid:uid, tid:tid, fid:fid);
  3452.  if  ( fsize < 720896 ) 
  3453.     off = 0;
  3454.  else 
  3455.     off = fsize - 720896 ;
  3456.  
  3457.  
  3458.  for ( i = 0 ; off < fsize ; i ++ )
  3459.  {
  3460.    tmp = ReadAndX(socket:soc, uid:uid, tid:tid, fid:fid, count:16384, off:off); 
  3461.    tmp = str_replace(find:raw_string(0), replace:"", string:tmp);
  3462.    data += tmp;
  3463.    version = strstr(data, "ProductVersion");
  3464.    if ( version )
  3465.    {
  3466.      len = strlen(version);
  3467.      for(i=strlen("ProductVersion");i<len;i++)
  3468.      {
  3469.       if((ord(version[i]) < ord("0") || ord(version[i]) > ord("9")) && version[i] != ".")
  3470.     return (v);
  3471.       else 
  3472.         v += version[i];
  3473.      }
  3474.    }
  3475.    off += 16384;
  3476.  }
  3477.  
  3478.  return NULL;
  3479. }
  3480.  
  3481.